From cb69aa441dacf1cce097ef725700f8e8cdfa84b0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 11 Nov 2016 23:09:32 +0000 Subject: [PATCH 001/148] Add plugin to check vulns of dependencies Add OWASP Dependency-Check plugin to check the publicly disclosed vulnerabilities of the dependencies being used by ZAP API client. --- subprojects/zap-clientapi/zap-clientapi.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index ac20ab4..663c1d1 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,9 +1,11 @@ plugins { id "me.champeau.gradle.japicmp" version "0.1.2" + id "org.owasp.dependencycheck" version "1.4.4.1" } apply plugin: 'maven' apply plugin: 'signing' +apply plugin: 'org.owasp.dependencycheck' version '1.1.0-SNAPSHOT' ext.versionBC = '1.0.0' From d716222aa56970c3f8553362083392ed75537abe Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 17 Nov 2016 21:38:51 +0000 Subject: [PATCH 002/148] Generate Context Alert Filters API (v3) Generate the Context Alert Filters API, not previously included in the API client. --- .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../zaproxy/clientapi/gen/AlertFilter.java | 104 ++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 494b3f1..7fc8f02 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -49,6 +49,7 @@ import org.zaproxy.clientapi.core.Alert.Risk; import org.zaproxy.clientapi.gen.Acsrf; import org.zaproxy.clientapi.gen.AjaxSpider; +import org.zaproxy.clientapi.gen.AlertFilter; import org.zaproxy.clientapi.gen.Ascan; import org.zaproxy.clientapi.gen.Authentication; import org.zaproxy.clientapi.gen.Authorization; @@ -85,6 +86,7 @@ public class ClientApi { // Note that any new API implementations added have to be added here manually public Acsrf acsrf = new Acsrf(this); public AjaxSpider ajaxSpider = new AjaxSpider(this); + public AlertFilter alertFilter = new AlertFilter(this); public Ascan ascan = new Ascan(this); public Authentication authentication = new Authentication(this); public Authorization authorization = new Authorization(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java new file mode 100644 index 0000000..47e13df --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -0,0 +1,104 @@ +/* Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2016 the ZAP development team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + + +/** + * This file was automatically generated. + */ +public class AlertFilter { + + private final ClientApi api; + + public AlertFilter(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse alertFilterList(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + if (contextid != null) { + map.put("contextId", contextid); + } + return api.callApi("alertFilter", "view", "alertFilterList", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addAlertFilter(String apikey, String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("alertFilter", "action", "addAlertFilter", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeAlertFilter(String apikey, String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("alertFilter", "action", "removeAlertFilter", map); + } + +} From 04c50d446059b6520c2a7164023dc0b5e02f3937 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 23 Nov 2016 19:34:26 +0000 Subject: [PATCH 003/148] Expose Alert fields returned by ZAP API Change Alert class to expose the alert ID, message ID and scanner ID. Add "False Positive" to enum Alert.Confidence, which can be set in the returned Alerts. --- .../org/zaproxy/clientapi/core/Alert.java | 120 +++++++++++++++++- .../org/zaproxy/clientapi/core/ClientApi.java | 18 +-- 2 files changed, 114 insertions(+), 24 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index a4dfd1b..680f15e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -29,8 +29,9 @@ public enum Risk {Informational, Low, Medium, High}; */ @Deprecated public enum Reliability {Suspicious, Warning}; - public enum Confidence {Low, Medium, High, Confirmed}; + public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; + private String id; private String alert; private Risk risk; /** @@ -50,7 +51,35 @@ public enum Confidence {Low, Medium, High, Confirmed}; private String solution; private int cweId; private int wascId; + private String messageId; + private String pluginId; + /** + * Constructs an {@code Alert} from the given {@code ApiResponseSet}. + * + * @param apiResponseSet the {@code ApiResponseSet} returned from an alert related ZAP API call. + * @since TODO add version + */ + public Alert(ApiResponseSet apiResponseSet) { + super(); + this.id = apiResponseSet.getValue("id"); + this.pluginId = apiResponseSet.getValue("pluginId"); + this.alert = apiResponseSet.getValue("alert"); + this.description = apiResponseSet.getValue("description"); + this.risk = stringToRisk(apiResponseSet.getValue("risk")); + this.confidence = stringToConfidence(apiResponseSet.getValue("confidence")); + this.url = apiResponseSet.getValue("url"); + this.other = apiResponseSet.getValue("other"); + this.param = apiResponseSet.getValue("param"); + this.attack = apiResponseSet.getValue("attack"); + this.evidence = apiResponseSet.getValue("evidence"); + this.reference = apiResponseSet.getValue("reference"); + this.cweId = stringToInt(apiResponseSet.getValue("cweid"), 0); + this.wascId = stringToInt(apiResponseSet.getValue("wascid"), 0); + this.solution = apiResponseSet.getValue("solution"); + this.messageId = apiResponseSet.getValue("messageId"); + } + public Alert(String alert, String url, String riskStr, String confidenceStr, String param, String other) { super(); @@ -58,12 +87,8 @@ public Alert(String alert, String url, String riskStr, String confidenceStr, this.url = url; this.other = other; this.param = param; - if (riskStr != null) { - this.risk = Risk.valueOf(riskStr); - } - if (confidenceStr != null) { - this.confidence = Confidence.valueOf(confidenceStr); - } + this.risk = stringToRisk(riskStr); + this.confidence = stringToConfidence(confidenceStr); } public Alert(String alert, String url, Risk risk, Confidence confidence, @@ -110,6 +135,87 @@ public Alert(String alert, String url) { this.url = url; } + /** + * Converts the given {@code string} to an {@code int}. + *

+ * If the given {@code string} is {@code null} or not a valid {@code int}, the default value is returned. + * + * @param string the string to be converted to {@code int}. + * @param defaultValue the value to return in case the {@code string} is {@code null} or not an {@code int}. + * @return the {@code int} converted from the {@code string}, or the default value if {@code string} is {@code null} or not + * an {@code int}. + */ + private static int stringToInt(String string, int defaultValue) { + if (string == null) { + return defaultValue; + } + try { + return Integer.parseInt(string); + } catch (NumberFormatException e) { + // Ignore. + } + return defaultValue; + } + + /** + * Converts the given {@code string} to a {@link Risk} value. + * + * @param string the string to be converted to a {@link Risk} value. + * @return the {@code Risk} value converted from the {@code string}, or null if {@code string} is {@code null}. + */ + private static Risk stringToRisk(String string) { + if (string == null) { + return null; + } + return Risk.valueOf(string); + } + + /** + * Converts the given {@code string} to a {@link Confidence} value. + * + * @param string the string to be converted to a {@link Confidence} value. + * @return the {@code Confidence} value converted from the {@code string}, or null if {@code string} is {@code null}. + */ + private static Confidence stringToConfidence(String string) { + if (string == null) { + return null; + } + if ("False Positive".equalsIgnoreCase(string)) { + return Confidence.FalsePositive; + } + return Confidence.valueOf(string); + } + + /** + * Gets the ID of the alert. + * + * @return the ID of the alert. + * @since TODO add version + */ + public String getId() { + return id; + } + + /** + * Gets the ID of the plugin/scanner that raised the alert. + * + * @return the ID of the plugin/scanner that raised the alert. + * @since TODO add version + */ + public String getPluginId() { + return pluginId; + } + + /** + * Gets the ID of the HTTP message of the alert. + * + * @return the ID of the HTTP message. + * @since TODO add version + */ + public String getMessageId() { + return messageId; + } + public String getAlert() { return alert; } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 7fc8f02..b9476c8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -45,8 +45,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; -import org.zaproxy.clientapi.core.Alert.Confidence; -import org.zaproxy.clientapi.core.Alert.Risk; import org.zaproxy.clientapi.gen.Acsrf; import org.zaproxy.clientapi.gen.AjaxSpider; import org.zaproxy.clientapi.gen.AlertFilter; @@ -192,21 +190,7 @@ public List getAlerts(String baseUrl, int start, int count) throws Client if (response != null && response instanceof ApiResponseList) { ApiResponseList alertList = (ApiResponseList)response; for (ApiResponse resp : alertList.getItems()) { - ApiResponseSet alertSet = (ApiResponseSet)resp; - alerts.add(new Alert( - alertSet.getValue("alert"), - alertSet.getValue("url"), - Risk.valueOf(alertSet.getValue("risk")), - Confidence.valueOf(alertSet.getValue("confidence")), - alertSet.getValue("param"), - alertSet.getValue("other"), - alertSet.getValue("attack"), - alertSet.getValue("description"), - alertSet.getValue("reference"), - alertSet.getValue("solution"), - alertSet.getValue("evidence"), - Integer.parseInt(alertSet.getValue("cweid")), - Integer.parseInt(alertSet.getValue("wascid")))); + alerts.add(new Alert((ApiResponseSet) resp)); } } return alerts; From 0d8040a15dd09de2f6f8e20da74fd7c94540a50f Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 29 Nov 2016 23:22:30 +0000 Subject: [PATCH 004/148] Update Gradle wrapper Update Gradle wrapper to latest version, 3.2.1. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 53556 -> 52818 bytes gradle/wrapper/gradle-wrapper.properties | 5 ++--- gradlew | 5 +++++ gradlew.bat | 6 ------ 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 453321d..77385b8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ task wrapper(type: Wrapper) { - gradleVersion = '2.13' + gradleVersion = '3.2.1' } apply from: "gradle/compile.gradle" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ca78035ef0501d802d4fc55381ef2d5c3ce0ec6e..deedc7fa5e6310eac3148a7dd0b1f069b07364cb 100644 GIT binary patch delta 10610 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 H{z3mAxA?u1 delta 11465 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 V+VyW_t#4=txRSBMp?&$o{6A(>Qtki% diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 58a993b..5f405a9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ -#Wed Jun 01 09:44:38 WEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip -distributionSha256Sum=0f665ec6a5a67865faf7ba0d825afb19c26705ea0597cec80dd191b0f2cbb664 \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip +distributionSha256Sum=9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689 \ No newline at end of file diff --git a/gradlew b/gradlew index 27309d9..9aa616c 100755 --- a/gradlew +++ b/gradlew @@ -161,4 +161,9 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index f6d5974..e95643d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -49,7 +49,6 @@ goto fail @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From 92c5a9d133f45db3de52da5ec9d66854664d9711 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 29 Nov 2016 23:22:53 +0000 Subject: [PATCH 005/148] Use same version for both artifacts Use the same version for both Java API client and Ant tasks, as both artifacts are maintained and released at the same time. --- build.gradle | 3 +++ subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle | 2 -- subprojects/zap-clientapi/zap-clientapi.gradle | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 453321d..1d4936b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,9 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' + version '1.1.0-SNAPSHOT' + ext.versionBC = '1.0.0' + repositories { mavenLocal() mavenCentral() diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index d1b73e2..ebd2b3b 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -1,6 +1,4 @@ -version '1.0.1-SNAPSHOT' - dependencies { compile project(':zap-clientapi') compileOnly 'org.apache.ant:ant:1.9.7' diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index ac20ab4..3808719 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -5,9 +5,6 @@ plugins { apply plugin: 'maven' apply plugin: 'signing' -version '1.1.0-SNAPSHOT' -ext.versionBC = '1.0.0' - dependencies { compile 'org.jdom:jdom:1.1.3' } sourceSets { examples } From 3b8305e1b58c04203fc3aa8fe14e2483de314116 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 23 Nov 2016 19:36:54 +0000 Subject: [PATCH 006/148] Use name for alerts Change classes Alert and AlertTask to use name instead of alert for the name of the alert, deprecate the alert setters/getters and add new ones for the name. Change other classes to use the new methods. Related to zaproxy/zaproxy#1341 - Update alert XML schema to remove element-level name collision --- .../zaproxy/clientapi/ant/AlertCheckTask.java | 4 +- .../org/zaproxy/clientapi/ant/AlertTask.java | 43 +++++++++- .../org/zaproxy/clientapi/core/Alert.java | 79 ++++++++++++++----- .../zaproxy/clientapi/core/AlertsFile.java | 14 +++- 4 files changed, 111 insertions(+), 29 deletions(-) diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java index 4434348..90c9326 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java @@ -36,10 +36,10 @@ public void execute() throws BuildException { List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); List requireAlerts = new ArrayList<>(requireAlertTasks.size()); for (AlertTask alert: ignoreAlertTasks) { - ignoreAlerts.add(new Alert(alert.getAlert(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); + ignoreAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); } for (AlertTask alert: requireAlertTasks) { - requireAlerts.add(new Alert(alert.getAlert(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); + requireAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); } this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index b94fb63..babe3b9 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -22,7 +22,7 @@ import org.apache.tools.ant.Task; public class AlertTask extends Task { - private String alert; + private String name; private String risk; /** * @deprecated @@ -35,11 +35,46 @@ public class AlertTask extends Task { private String other; private String param; + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since TODO add version + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since TODO add version + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (TODO add version) Use {@link #getName()} instead. + */ + @Deprecated public String getAlert() { - return alert; + return name; } - public void setAlert(String alert) { - this.alert = alert; + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (TODO add version) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; } public String getRisk() { return risk; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index 680f15e..bc12c2a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -32,7 +32,7 @@ public enum Reliability {Suspicious, Warning}; public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; private String id; - private String alert; + private String name; private Risk risk; /** * @deprecated (2.4.0) Replaced by {@link Confidence}. @@ -64,7 +64,12 @@ public Alert(ApiResponseSet apiResponseSet) { super(); this.id = apiResponseSet.getValue("id"); this.pluginId = apiResponseSet.getValue("pluginId"); - this.alert = apiResponseSet.getValue("alert"); + String name = apiResponseSet.getValue("name"); + if (name == null) { + // TODO Remove once alert attribute is no longer supported. + name = apiResponseSet.getValue("alert"); + } + this.name = name; this.description = apiResponseSet.getValue("description"); this.risk = stringToRisk(apiResponseSet.getValue("risk")); this.confidence = stringToConfidence(apiResponseSet.getValue("confidence")); @@ -80,10 +85,10 @@ public Alert(ApiResponseSet apiResponseSet) { this.messageId = apiResponseSet.getValue("messageId"); } - public Alert(String alert, String url, String riskStr, String confidenceStr, + public Alert(String name, String url, String riskStr, String confidenceStr, String param, String other) { super(); - this.alert = alert; + this.name = name; this.url = url; this.other = other; this.param = param; @@ -91,11 +96,11 @@ public Alert(String alert, String url, String riskStr, String confidenceStr, this.confidence = stringToConfidence(confidenceStr); } - public Alert(String alert, String url, Risk risk, Confidence confidence, + public Alert(String name, String url, Risk risk, Confidence confidence, String param, String other, String attack, String description, String reference, String solution, String evidence, int cweId, int wascId) { super(); - this.alert = alert; + this.name = name; this.risk = risk; this.confidence = confidence; this.url = url; @@ -110,10 +115,10 @@ public Alert(String alert, String url, Risk risk, Confidence confidence, this.wascId = wascId; } - public Alert(String alert, String url, Risk risk, Confidence confidence, + public Alert(String name, String url, Risk risk, Confidence confidence, String param, String other) { super(); - this.alert = alert; + this.name = name; this.risk = risk; this.confidence = confidence; this.url = url; @@ -121,17 +126,17 @@ public Alert(String alert, String url, Risk risk, Confidence confidence, this.param = param; } - public Alert(String alert, String url, Risk risk, Confidence confidence) { + public Alert(String name, String url, Risk risk, Confidence confidence) { super(); - this.alert = alert; + this.name = name; this.risk = risk; this.confidence = confidence; this.url = url; } - public Alert(String alert, String url) { + public Alert(String name, String url) { super(); - this.alert = alert; + this.name = name; this.url = url; } @@ -216,11 +221,45 @@ public String getMessageId() { return messageId; } + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since TODO add version + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since TODO add version + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (TODO add version) Use {@link #getName()} instead. + */ + @Deprecated public String getAlert() { - return alert; + return name; } - public void setAlert(String alert) { - this.alert = alert; + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (TODO add version) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; } public Risk getRisk() { return risk; @@ -316,7 +355,7 @@ public int getWascId() { public boolean matches (Alert alertFilter) { boolean matches = true; - if (alertFilter.getAlert() != null && ! alertFilter.getAlert().equals(alert) ) { + if (alertFilter.getName() != null && ! alertFilter.getName().equals(name) ) { matches = false; } if (alertFilter.getRisk() != null && ! alertFilter.getRisk().equals(risk) ) { @@ -333,7 +372,7 @@ public boolean matches (Alert alertFilter) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((alert == null) ? 0 : alert.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((attack == null) ? 0 : attack.hashCode()); result = prime * result + cweId; result = prime * result + ((description == null) ? 0 : description.hashCode()); @@ -361,11 +400,11 @@ public boolean equals(Object object) { return false; } Alert otherAlert = (Alert) object; - if (alert == null) { - if (otherAlert.alert != null) { + if (name == null) { + if (otherAlert.name != null) { return false; } - } else if (!alert.equals(otherAlert.alert)) { + } else if (!name.equals(otherAlert.name)) { return false; } if (attack == null) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index f463db9..7374618 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -63,8 +63,11 @@ private static void writeAlertsToFile(File outputFile, Document doc) { private static void createAlertXMLElements(Element alertsFound, Alert alert) { Element alertElement = new Element("alert"); - if (alert.getAlert() != null) - alertElement.setAttribute("alert", alert.getAlert()); + if (alert.getName() != null) { + alertElement.setAttribute("name", alert.getName()); + // TODO Remove once alert attribute is no longer supported. + alertElement.setAttribute("alert", alert.getName()); + } if (alert.getRisk() != null) alertElement.setAttribute("risk", alert.getRisk().name()); if (alert.getUrl() != null) @@ -93,8 +96,13 @@ public static List getAlertsFromFile(File file, String alertType) throws @SuppressWarnings("unchecked") List alertElements = alertsDoc.getRootElement().getChildren(alertType); for (Element element: alertElements){ + String name = element.getAttributeValue("name"); + if (name == null) { + // TODO Remove once alert attribute is no longer supported. + name = element.getAttributeValue("alert"); + } Alert alert = new Alert( - element.getAttributeValue("alert"), + name, element.getAttributeValue("url"), element.getAttributeValue("risk"), element.getAttributeValue("confidence"), From 3681c5ce2e7acdceeea54557a0981c44a51f47eb Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 30 Jan 2017 22:55:25 +0000 Subject: [PATCH 007/148] Regenerate Selenium API (v8) Regenerate the Selenium API to match the latest version, which allows to set the path to geckodriver. Also, add the description of the API endpoints. --- .../org/zaproxy/clientapi/gen/Selenium.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 809bf2f..dcce0e9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -39,6 +39,8 @@ public Selenium(ClientApi api) { } /** + * Returns the current path to ChromeDriver + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionChromeDriverPath() throws ClientApiException { @@ -46,6 +48,8 @@ public ApiResponse optionChromeDriverPath() throws ClientApiException { } /** + * Returns the current path to Firefox binary + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionFirefoxBinaryPath() throws ClientApiException { @@ -53,6 +57,17 @@ public ApiResponse optionFirefoxBinaryPath() throws ClientApiException { } /** + * Returns the current path to Firefox driver (geckodriver) + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionFirefoxDriverPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionFirefoxDriverPath", null); + } + + /** + * Returns the current path to IEDriverServer + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionIeDriverPath() throws ClientApiException { @@ -60,6 +75,8 @@ public ApiResponse optionIeDriverPath() throws ClientApiException { } /** + * Returns the current path to PhantomJS binary + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { @@ -67,6 +84,8 @@ public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { } /** + * Sets the current path to ChromeDriver + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionChromeDriverPath(String apikey, String string) throws ClientApiException { @@ -79,6 +98,8 @@ public ApiResponse setOptionChromeDriverPath(String apikey, String string) throw } /** + * Sets the current path to Firefox binary + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) throws ClientApiException { @@ -91,6 +112,22 @@ public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) thro } /** + * Sets the current path to Firefox driver (geckodriver) + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); + } + + /** + * Sets the current path to IEDriverServer + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionIeDriverPath(String apikey, String string) throws ClientApiException { @@ -103,6 +140,8 @@ public ApiResponse setOptionIeDriverPath(String apikey, String string) throws Cl } /** + * Sets the current path to PhantomJS binary + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) throws ClientApiException { From e6356ab7b99ae4098fa842ecda43f6d34a9034a4 Mon Sep 17 00:00:00 2001 From: thc202 Date: Sun, 5 Mar 2017 22:10:03 +0000 Subject: [PATCH 008/148] Allow to specify the API key through the ClientApi Change ClientApi to allow to specify the ZAP API key when creating the instance, to ensure that the API key is sent with all API requests. Also, send it in the header not just as (query) parameter (for newer and older versions of ZAP). Update SimpleExample to indicate the new usage. Related to zaproxy/zaproxy#3226 - Option to supply API key or nonces via header --- .../clientapi/examples/SimpleExample.java | 9 +- .../org/zaproxy/clientapi/core/ClientApi.java | 114 ++++++++++++++++-- 2 files changed, 109 insertions(+), 14 deletions(-) diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 7142ab8..02ddffc 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -37,12 +37,13 @@ public class SimpleExample { private static final String TARGET = "http://localhost:8080/bodgeit/"; public static void main(String[] args) { - ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT); + ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); try { // Start spidering the target System.out.println("Spider : " + TARGET); - ApiResponse resp = api.spider.scan(ZAP_API_KEY, TARGET, null, null, null, null); + // It's not necessary to pass the ZAP API key again, already set when creating the ClientApi. + ApiResponse resp = api.spider.scan(null, TARGET, null, null, null, null); String scanid; int progress; @@ -64,7 +65,7 @@ public static void main(String[] args) { Thread.sleep(2000); System.out.println("Active scan : " + TARGET); - resp = api.ascan.scan(ZAP_API_KEY, TARGET, "True", "False", null, null, null); + resp = api.ascan.scan(null, TARGET, "True", "False", null, null, null); // The scan now returns a scan id to support concurrent scanning scanid = ((ApiResponseElement) resp).getValue(); @@ -81,7 +82,7 @@ public static void main(String[] args) { System.out.println("Active Scan complete"); System.out.println("Alerts:"); - System.out.println(new String(api.core.xmlreport(ZAP_API_KEY))); + System.out.println(new String(api.core.xmlreport(null))); } catch (Exception e) { System.out.println("Exception : " + e.getMessage()); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index b9476c8..951f274 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -36,9 +36,11 @@ import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.TimeUnit; import javax.xml.parsers.DocumentBuilder; @@ -74,6 +76,9 @@ public class ClientApi { private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; + private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; + private static final String ZAP_API_KEY_PARAM = "apikey"; + private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); private boolean debug = false; private PrintStream debugStream = System.out; @@ -81,6 +86,8 @@ public class ClientApi { private final String zapAddress; private final int zapPort; + private final String apiKey; + // Note that any new API implementations added have to be added here manually public Acsrf acsrf = new Acsrf(this); public AjaxSpider ajaxSpider = new AjaxSpider(this); @@ -110,12 +117,41 @@ public class ClientApi { public ClientApi (String zapAddress, int zapPort) { this(zapAddress, zapPort, false); } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API + * requests. + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @since TODO add version + */ + public ClientApi(String zapAddress, int zapPort, String apiKey) { + this(zapAddress, zapPort, apiKey, false); + } public ClientApi (String zapAddress, int zapPort, boolean debug) { + this(zapAddress, zapPort, null, debug); + } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API + * requests. Also, sets whether or not client API debug information should be written to the + * {@link #setDebugStream(PrintStream) debug stream} (by default the standard output stream). + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @param debug {@code true} if debug information should be written to debug stream, {@code false} otherwise. + * @since TODO add version + */ + public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); this.debug = debug; this.zapAddress = zapAddress; this.zapPort = zapPort; + this.apiKey = apiKey; } public void setDebugStream(PrintStream debugStream) { @@ -279,23 +315,26 @@ public ApiResponse callApi (String component, String type, String method, private Document callApiDom (String component, String type, String method, Map params) throws ClientApiException { try { - URL url = buildZapRequestUrl("xml", component, type, method, params); + HttpRequest request = buildZapRequest("xml", component, type, method, params); if (debug) { - debugStream.println("Open URL: " + url); + debugStream.println("Open URL: " + request.getRequestUri()); } //get the factory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //Using factory get an instance of document builder DocumentBuilder db = dbf.newDocumentBuilder(); //parse using builder to get DOM representation of the XML file - return db.parse(getConnectionInputStream(url)); + return db.parse(getConnectionInputStream(request)); } catch (Exception e) { throw new ClientApiException(e); } } - private InputStream getConnectionInputStream(URL url) throws IOException { - HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy); + private InputStream getConnectionInputStream(HttpRequest request) throws IOException { + HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); + for (Entry header : request.getHeaders().entrySet()) { + uc.setRequestProperty(header.getKey(), header.getValue()); + } uc.connect(); if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { return uc.getErrorStream(); @@ -306,11 +345,11 @@ private InputStream getConnectionInputStream(URL url) throws IOException { public byte[] callApiOther (String component, String type, String method, Map params) throws ClientApiException { try { - URL url = buildZapRequestUrl("other", component, type, method, params); + HttpRequest request = buildZapRequest("other", component, type, method, params); if (debug) { - debugStream.println("Open URL: " + url); + debugStream.println("Open URL: " + request.getRequestUri()); } - InputStream in = getConnectionInputStream(url); + InputStream in = getConnectionInputStream(request); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[8 * 1024]; try { @@ -329,7 +368,7 @@ public byte[] callApiOther (String component, String type, String method, } } - private static URL buildZapRequestUrl( + private HttpRequest buildZapRequest( String format, String component, String type, @@ -346,6 +385,10 @@ private static URL buildZapRequestUrl( sb.append(method); sb.append('/'); if (params != null) { + if (apiKey != null && !apiKey.isEmpty()) { + params.put(ZAP_API_KEY_PARAM, apiKey); + } + sb.append('?'); for (Map.Entry p : params.entrySet()) { sb.append(encodeQueryParam(p.getKey())); @@ -357,7 +400,11 @@ private static URL buildZapRequestUrl( } } - return new URL(sb.toString()); + HttpRequest request = new HttpRequest(new URL(sb.toString())); + if (apiKey != null && !apiKey.isEmpty()) { + request.addHeader(ZAP_API_KEY_HEADER, apiKey); + } + return request; } private static String encodeQueryParam(String param) { @@ -490,4 +537,51 @@ public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIn private static ClientApiException newTimeoutConnectionToZap(int timeoutInSeconds) { return new ClientApiException("Unable to connect to ZAP's proxy after " + timeoutInSeconds + " seconds."); } + + /** + * A simple HTTP request. + *

+ * Contains the request URI and headers. + */ + private static class HttpRequest { + + private final URL requestUri; + private final Map headers; + + public HttpRequest(URL url) { + this.requestUri = url; + this.headers = new HashMap<>(); + } + + /** + * Gets the request URI of the request. + * + * @return the request URI. + */ + public URL getRequestUri() { + return requestUri; + } + + /** + * Adds a header with the given name and value. + *

+ * If a header with the given name already exists it is replaced with the new value. + * + * @param name the name of the header. + * @param value the value of the header. + */ + public void addHeader(String name, String value) { + headers.put(name, value); + } + + /** + * Gets the headers of the HTTP request. An unmodifiable {@code Map} containing the headers (the keys correspond to the + * header names and the values for its contents). + * + * @return an unmodifiable {@code Map} containing the headers. + */ + public Map getHeaders() { + return Collections.unmodifiableMap(headers); + } + } } From be6a2082cdc1d90aa94b34a87076f6bc69098118 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 6 Mar 2017 08:47:55 +0000 Subject: [PATCH 009/148] Change value type of ApiResponseSet to ApiResponse Change ApiResponseSet to not assume that the values of the set are of the type ApiResponseElement (by changing the type of the values to ApiResponse) and add helper method to return the values as String. Change Alert to use the new method (to get the value(s) as String). Change ApiResponseElement to return its value when toString() is called. Fix zaproxy/zaproxy#3228 - ApiResponseElement casting error in constructor of ApiResponseSet (if child is also a set) --- .../org/zaproxy/clientapi/core/Alert.java | 34 ++++++------ .../clientapi/core/ApiResponseElement.java | 4 ++ .../clientapi/core/ApiResponseSet.java | 52 ++++++++++++++----- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index bc12c2a..e180650 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -62,27 +62,27 @@ public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; */ public Alert(ApiResponseSet apiResponseSet) { super(); - this.id = apiResponseSet.getValue("id"); - this.pluginId = apiResponseSet.getValue("pluginId"); - String name = apiResponseSet.getValue("name"); + this.id = apiResponseSet.getStringValue("id"); + this.pluginId = apiResponseSet.getStringValue("pluginId"); + String name = apiResponseSet.getStringValue("name"); if (name == null) { // TODO Remove once alert attribute is no longer supported. - name = apiResponseSet.getValue("alert"); + name = apiResponseSet.getStringValue("alert"); } this.name = name; - this.description = apiResponseSet.getValue("description"); - this.risk = stringToRisk(apiResponseSet.getValue("risk")); - this.confidence = stringToConfidence(apiResponseSet.getValue("confidence")); - this.url = apiResponseSet.getValue("url"); - this.other = apiResponseSet.getValue("other"); - this.param = apiResponseSet.getValue("param"); - this.attack = apiResponseSet.getValue("attack"); - this.evidence = apiResponseSet.getValue("evidence"); - this.reference = apiResponseSet.getValue("reference"); - this.cweId = stringToInt(apiResponseSet.getValue("cweid"), 0); - this.wascId = stringToInt(apiResponseSet.getValue("wascid"), 0); - this.solution = apiResponseSet.getValue("solution"); - this.messageId = apiResponseSet.getValue("messageId"); + this.description = apiResponseSet.getStringValue("description"); + this.risk = stringToRisk(apiResponseSet.getStringValue("risk")); + this.confidence = stringToConfidence(apiResponseSet.getStringValue("confidence")); + this.url = apiResponseSet.getStringValue("url"); + this.other = apiResponseSet.getStringValue("other"); + this.param = apiResponseSet.getStringValue("param"); + this.attack = apiResponseSet.getStringValue("attack"); + this.evidence = apiResponseSet.getStringValue("evidence"); + this.reference = apiResponseSet.getStringValue("reference"); + this.cweId = stringToInt(apiResponseSet.getStringValue("cweid"), 0); + this.wascId = stringToInt(apiResponseSet.getStringValue("wascid"), 0); + this.solution = apiResponseSet.getStringValue("solution"); + this.messageId = apiResponseSet.getStringValue("messageId"); } public Alert(String name, String url, String riskStr, String confidenceStr, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java index 5ccdd8b..cac1213 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java @@ -64,4 +64,8 @@ public String toString(int indent) { return sb.toString(); } + @Override + public String toString() { + return getValue(); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java index 1e2ebdb..c9f5a5a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java @@ -29,7 +29,7 @@ public class ApiResponseSet extends ApiResponse { private String[] attributes = null; - private final Map valuesMap; + private final Map valuesMap; /** * Constructs an {@code ApiResponseSet} with the given name and attributes. @@ -45,7 +45,7 @@ public ApiResponseSet(String name, String[] attributes) { this.valuesMap = Collections.emptyMap(); } - public ApiResponseSet(String name, Map values) { + public ApiResponseSet(String name, Map values) { super(name); this.valuesMap = Collections.unmodifiableMap(new HashMap<>(values)); } @@ -53,10 +53,10 @@ public ApiResponseSet(String name, Map values) { public ApiResponseSet(Node node) throws ClientApiException { super(node.getNodeName()); Node child = node.getFirstChild(); - Map values = new HashMap<>(); + Map values = new HashMap<>(); while (child != null) { - ApiResponseElement elem = (ApiResponseElement) ApiResponseFactory.getResponse(child); - values.put(elem.getName(), elem.getValue()); + ApiResponse elem = ApiResponseFactory.getResponse(child); + values.put(elem.getName(), elem); child = child.getNextSibling(); } this.valuesMap = Collections.unmodifiableMap(values); @@ -79,11 +79,11 @@ public String[] getAttributes() { * * @param key the key of the value * @return the value, or {@code null} if no value exists for the given {@code key}. - * @deprecated (TODO add version) Use {@link #getValue(String)} instead. + * @deprecated (TODO add version) Use {@link #getStringValue(String)} or {@link #getValue(String)} instead. */ @Deprecated public String getAttribute(String key) { - return getValue(key); + return getStringValue(key); } /** @@ -93,11 +93,32 @@ public String getAttribute(String key) { * @return the value, or {@code null} if no value exists for the given {@code key}. * @since TODO add version * @see #getKeys() + * @see #getStringValue(String) */ - public String getValue(String key) { + public ApiResponse getValue(String key) { return valuesMap.get(key); } + /** + * Gets the value for the given {@code key} as {@code String}. + *

+ * For {@link ApiResponseElement}s it returns {@link ApiResponseElement#getValue() its value}, for other {@link ApiResponse} + * types it returns the conversion to {@code String}. + * + * @param key the key of the value + * @return the value, or {@code null} if no value exists for the given {@code key}. + * @since TODO add version + * @see #getKeys() + * @see #getValue(String) + */ + public String getStringValue(String key) { + ApiResponse value = valuesMap.get(key); + if (value instanceof ApiResponseElement) { + return ((ApiResponseElement) value).getValue(); + } + return value != null ? value.toString() : null; + } + /** * Gets a {@code Map} with the keys and values. *

@@ -107,7 +128,7 @@ public String getValue(String key) { * @return the map with the keys/values, never {@code null}. * @since TODO add version */ - public Map getValuesMap() { + public Map getValuesMap() { return valuesMap; } @@ -120,6 +141,7 @@ public Map getValuesMap() { * @return the keys, never {@code null}. * @since TODO add version * @see #getValue(String) + * @see #getStringValue(String) * @see #getValues() * @see #getValuesMap() */ @@ -136,8 +158,9 @@ public Set getKeys() { * @return the values, never {@code null}. * @since TODO add version * @see #getValue(String) + * @see #getStringValue(String) */ - public Collection getValues() { + public Collection getValues() { return valuesMap.values(); } @@ -150,13 +173,18 @@ public String toString(int indent) { sb.append("ApiResponseSet "); sb.append(this.getName()); sb.append(" : [\n"); - for (Entry val : valuesMap.entrySet()) { + for (Entry val : valuesMap.entrySet()) { for (int i=0 ; i < indent+1; i++) { sb.append("\t"); } sb.append(val.getKey()); sb.append(" = "); - sb.append(val.getValue()); + if (val.getValue() instanceof ApiResponseElement) { + sb.append(val.getValue()); + } else { + sb.append('\n'); + sb.append(val.getValue().toString(indent + 2)); + } sb.append("\n"); } for (int i=0 ; i < indent; i++) { From da79afd3f80436280f3ef0cf47faa948e6754d81 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 7 Mar 2017 22:03:21 +0000 Subject: [PATCH 010/148] Allow to specify the API key in all Ant tasks Change the Ant tasks to allow to specify the API key (move the API key attribute to base class ZapTask) as it might be required for newer ZAP versions. Add tests to check that the tasks accept the expected attributes and nested elements. --- .../clientapi/ant/ActiveScanSubtreeTask.java | 11 +- .../clientapi/ant/ActiveScanUrlTask.java | 11 +- .../clientapi/ant/LoadSessionTask.java | 11 +- .../zaproxy/clientapi/ant/NewSessionTask.java | 11 +- .../clientapi/ant/SaveSessionTask.java | 11 +- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 11 +- .../zaproxy/clientapi/ant/StopZapTask.java | 12 +- .../org/zaproxy/clientapi/ant/ZapTask.java | 11 +- .../org/zaproxy/clientapi/ant/BuildTest.java | 154 ++++++++++++++++++ .../org/zaproxy/clientapi/ant/build.xml | 61 +++++++ .../zap-clientapi-ant.gradle | 3 + 11 files changed, 235 insertions(+), 72 deletions(-) create mode 100644 subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java create mode 100644 subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java index 3b481a1..a989b51 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java @@ -24,12 +24,11 @@ public class ActiveScanSubtreeTask extends ZapTask { private String url; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().ascan.scan(apikey, url, "true", "false", "", "", ""); + this.getClientApi().ascan.scan(null, url, "true", "false", "", "", ""); } catch (Exception e) { throw new BuildException(e); @@ -43,12 +42,4 @@ public String getUrl() { public void setUrl(String url) { this.url = url; } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index d8a883c..2e9c743 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -24,12 +24,11 @@ public class ActiveScanUrlTask extends ZapTask { private String url; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().ascan.scan(apikey, url, "false", "false", "", "", ""); + this.getClientApi().ascan.scan(null, url, "false", "false", "", "", ""); } catch (Exception e) { throw new BuildException(e); @@ -43,12 +42,4 @@ public String getUrl() { public void setUrl(String url) { this.url = url; } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java index aa8be39..cc8080f 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java @@ -24,12 +24,11 @@ public class LoadSessionTask extends ZapTask { private String name; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().core.loadSession(apikey, name); + this.getClientApi().core.loadSession(null, name); } catch (Exception e) { throw new BuildException(e); @@ -43,12 +42,4 @@ public String getName() { public void setName(String name) { this.name = name; } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java index fa1ceec..243b074 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java @@ -24,12 +24,11 @@ public class NewSessionTask extends ZapTask { private String name; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().core.newSession(apikey, name, "true"); + this.getClientApi().core.newSession(null, name, "true"); } catch (Exception e) { throw new BuildException(e); @@ -43,12 +42,4 @@ public String getName() { public void setName(String name) { this.name = name; } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java index 4649e58..3830bf4 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java @@ -24,12 +24,11 @@ public class SaveSessionTask extends ZapTask { private String name; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().core.saveSession(apikey, name, "true"); + this.getClientApi().core.saveSession(null, name, "true"); } catch (Exception e) { throw new BuildException(e); @@ -43,12 +42,4 @@ public String getName() { public void setName(String name) { this.name = name; } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 7ee5f01..04d5e20 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -24,12 +24,11 @@ public class SpiderUrlTask extends ZapTask { private String url; - private String apikey; @Override public void execute() throws BuildException { try { - this.getClientApi().spider.scan(apikey, url, "", "", null, null); + this.getClientApi().spider.scan(null, url, "", "", null, null); } catch (Exception e) { throw new BuildException(e); @@ -44,12 +43,4 @@ public void setUrl(String url) { this.url = url; } - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } - } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 7978e30..24872d4 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -23,24 +23,14 @@ public class StopZapTask extends ZapTask { - private String apikey; - @Override public void execute() throws BuildException { try { - this.getClientApi().core.shutdown(apikey); + this.getClientApi().core.shutdown(null); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e); } } - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } - } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java index af83eda..80f881d 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java @@ -26,9 +26,10 @@ public abstract class ZapTask extends Task { private String zapAddress; private int zapPort; private boolean debug = false; + private String apikey; protected ClientApi getClientApi() { - return new ClientApi(zapAddress, zapPort, debug); + return new ClientApi(zapAddress, zapPort, apikey, debug); } public String getZapAddress() { @@ -51,4 +52,12 @@ public boolean isDebug() { public void setDebug(boolean debug) { this.debug = debug; } + + public String getApikey() { + return apikey; + } + + public void setApikey(String apikey) { + this.apikey = apikey; + } } diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java new file mode 100644 index 0000000..14117cf --- /dev/null +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -0,0 +1,154 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import static org.junit.Assert.assertTrue; + +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.BuildFileRule; +import org.apache.tools.ant.filters.StringInputStream; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.zaproxy.clientapi.core.ClientApiException; + +import fi.iki.elonen.NanoHTTPD; + +/** + * Tests that the tasks accept the expected attributes and nested elements. + */ +public class BuildTest { + + private static final String BUILD_FILE_NAME = "build.xml"; + private static final String BUILD_FILE_PATH = BuildTest.class.getResource(BUILD_FILE_NAME).toString().replace("file:", ""); + + private static SimpleServer zap; + private static SimpleServer targetSite; + + @Rule + public final BuildFileRule buildRule = new BuildFileRule(); + + @BeforeClass + public static void setUp() throws IOException { + zap = new SimpleServer( + "text/xml; charset=UTF-8", + "OK"); + + targetSite = new SimpleServer("text/plain", ""); + } + + @Before + public void setUpBuildFile() { + buildRule.configureProject(BUILD_FILE_PATH); + + // Properties used in build.xml file + buildRule.getProject().setProperty("zap.addr", "localhost"); + buildRule.getProject().setProperty("zap.port", Integer.toString(zap.getListeningPort())); + buildRule.getProject().setProperty("zap.key", "API_KEY"); + buildRule.getProject().setProperty("zap.targetUrl", "http://localhost:" + targetSite.getListeningPort()); + buildRule.getProject().setProperty("zap.session", "session"); + } + + @AfterClass + public static void tearDown() { + if (zap != null) { + zap.stop(); + } + + if (targetSite != null) { + targetSite.stop(); + } + } + + @Test + public void shouldExecuteTargetAccessUrl() { + buildRule.executeTarget("accessUrl"); + } + + @Test + public void shouldExecuteTargetActiveScanSubtree() { + buildRule.executeTarget("activeScanSubtree"); + } + + @Test + public void shouldExecuteTargetActiveScanUrl() { + buildRule.executeTarget("activeScanUrl"); + } + + @Test + public void shouldExecuteTargetAlertCheck() { + try { + buildRule.executeTarget("alertCheck"); + } catch (BuildException e) { + assertTrue(e.getCause() instanceof ClientApiException); + assertTrue(e.getCause().getMessage().startsWith("Not found 1 alerts")); + } + } + + @Test + public void shouldExecuteTargetLoadSession() { + buildRule.executeTarget("loadSession"); + } + + @Test + public void shouldExecuteTargetNewSession() { + buildRule.executeTarget("newSession"); + } + + @Test + public void shouldExecuteTargetSaveSession() { + buildRule.executeTarget("saveSession"); + } + + @Test + public void shouldExecuteTargetSpider() { + buildRule.executeTarget("spider"); + } + + @Test + public void shouldExecuteTargetStopZap() { + buildRule.executeTarget("stopZap"); + } + + private static class SimpleServer extends NanoHTTPD { + + private final String mimeType; + private final String response; + + public SimpleServer(String mimeType, String response) throws IOException { + super(0); + start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); + + this.mimeType = mimeType; + this.response = response; + } + + @Override + public Response serve(IHTTPSession session) { + return new Response(Response.Status.OK, mimeType, new StringInputStream(response), response.length()) { + // Extend to access the constructor. + }; + } + } +} \ No newline at end of file diff --git a/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml b/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml new file mode 100644 index 0000000..4eb105c --- /dev/null +++ b/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index ebd2b3b..7bfc6fc 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -2,6 +2,9 @@ dependencies { compile project(':zap-clientapi') compileOnly 'org.apache.ant:ant:1.9.7' + + testCompile 'org.apache.ant:ant-testutil:1.9.7' + testCompile 'org.nanohttpd:nanohttpd:2.3.1' } sourceSets { examples } From 94ca452fd8df352a9a97811003814abea09bea5b Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 7 Mar 2017 22:11:11 +0000 Subject: [PATCH 011/148] Change ClientApiMain to use the API key "globally" Change ClientApiMain to set the API key into the ClientApi instead of passing it in each action (the former sends the key with all API requests). --- .../zaproxy/clientapi/core/ClientApiMain.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index 37c2894..19a0d9e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -56,7 +56,7 @@ private void executeTask() throws Exception { try { switch(task){ case stop: - api.core.shutdown((String)params.get("apikey")); + api.core.shutdown(null); break; case checkAlerts: if (params.get("alertsFile") == null){ @@ -99,13 +99,13 @@ private void executeTask() throws Exception { showHelp(); System.exit(1); } - api.core.saveSession((String)params.get("apikey"), (String)params.get("sessionName"), "true"); + api.core.saveSession(null, (String)params.get("sessionName"), "true"); break; case newSession: if (params.get("sessionName") == null){ - api.core.newSession((String)params.get("apikey"), "", "true"); + api.core.newSession(null, "", "true"); }else{ - api.core.newSession((String)params.get("apikey"), (String)params.get("sessionName"), "true"); + api.core.newSession(null, (String)params.get("sessionName"), "true"); } break; case activeScanUrl: @@ -114,27 +114,27 @@ private void executeTask() throws Exception { showHelp(); System.exit(1); }else{ - api.ascan.scan((String)params.get("apikey"), (String)params.get("url"), "true", "false", "", "", ""); + api.ascan.scan(null, (String)params.get("url"), "true", "false", "", "", ""); } break; case activeScanSiteInScope: checkForUrlParam(); - api.activeScanSiteInScope((String)params.get("apikey"), (String)params.get("url")); + api.activeScanSiteInScope(null, (String)params.get("url")); break; case addExcludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.addExcludeFromContext((String)params.get("apikey"), (String)params.get("contextName"), (String)params.get("regex")); + api.addExcludeFromContext(null, (String)params.get("contextName"), (String)params.get("regex")); break; case addIncludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.addIncludeInContext((String)params.get("apikey"), (String)params.get("contextName"), (String)params.get("regex")); + api.addIncludeInContext(null, (String)params.get("contextName"), (String)params.get("regex")); break; case addIncludeOneMatchingNodeToContext: checkForContextNameParam(); checkForRegexParam(); - api.includeOneMatchingNodeInContext((String)params.get("apikey"), (String)params.get("contextName"), (String)params.get("regex")); + api.includeOneMatchingNodeInContext(null, (String)params.get("contextName"), (String)params.get("regex")); break; } } catch (ConnectException e){ @@ -208,7 +208,7 @@ private void initialize(String[] args) { showHelp(); System.exit(1); } - api = new ClientApi(zapaddr, zapport, debug); + api = new ClientApi(zapaddr, zapport, (String) params.get("apikey"), debug); } private void setTask(String arg) { From fefe8353e3087164c9a2dee1e18ab23675f8c844 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 8 Mar 2017 09:41:30 +0000 Subject: [PATCH 012/148] Remove printStackTrace from Ant task Change StopZapTask to remove the call to Throwable.printStackTrace(), the exception is wrapped and thrown for the caller to handle (e.g. Ant which already outputs the stack trace). --- .../src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java | 1 - 1 file changed, 1 deletion(-) diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 24872d4..36d7721 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -28,7 +28,6 @@ public void execute() throws BuildException { try { this.getClientApi().core.shutdown(null); } catch (Exception e) { - e.printStackTrace(); throw new BuildException(e); } } From 635eac51518fa231e78a05d9d6cfd1b695885d16 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 8 Mar 2017 15:35:46 +0000 Subject: [PATCH 013/148] Do not require to set the API key in each call Change API implementations to not require to set/use the API key in each API call (e.g. action/other) as that's already done by the ClientApi class. The old methods (the ones that have the apiKey parameter) are now in a separate class, to avoid the generated code to replace them, they are still required for compatibility with older versions. The usage of the old methods is discouraged (deprecated) and suggested to use the new ClientApi constructors to set the API key. Remove usage of the old methods throughout the code (ClientApi, ClientApiMain, examples, and Ant tasks). --- .../clientapi/ant/ActiveScanSubtreeTask.java | 2 +- .../clientapi/ant/ActiveScanUrlTask.java | 2 +- .../clientapi/ant/LoadSessionTask.java | 2 +- .../zaproxy/clientapi/ant/NewSessionTask.java | 2 +- .../clientapi/ant/SaveSessionTask.java | 2 +- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 2 +- .../zaproxy/clientapi/ant/StopZapTask.java | 2 +- .../clientapi/examples/SimpleExample.java | 6 +- .../FormBasedAuthentication.java | 10 +- .../org/zaproxy/clientapi/core/ClientApi.java | 92 ++- .../zaproxy/clientapi/core/ClientApiMain.java | 18 +- .../java/org/zaproxy/clientapi/gen/Acsrf.java | 33 +- .../org/zaproxy/clientapi/gen/AjaxSpider.java | 79 +- .../zaproxy/clientapi/gen/AlertFilter.java | 11 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 426 +++-------- .../zaproxy/clientapi/gen/Authentication.java | 45 +- .../zaproxy/clientapi/gen/Authorization.java | 17 +- .../org/zaproxy/clientapi/gen/Autoupdate.java | 128 +--- .../java/org/zaproxy/clientapi/gen/Break.java | 30 +- .../org/zaproxy/clientapi/gen/Context.java | 115 +-- .../java/org/zaproxy/clientapi/gen/Core.java | 391 +++------- .../org/zaproxy/clientapi/gen/ForcedUser.java | 28 +- .../zaproxy/clientapi/gen/HttpSessions.java | 79 +- .../zaproxy/clientapi/gen/ImportLogFiles.java | 37 +- .../org/zaproxy/clientapi/gen/Params.java | 6 +- .../java/org/zaproxy/clientapi/gen/Pnh.java | 74 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 62 +- .../org/zaproxy/clientapi/gen/Reveal.java | 17 +- .../org/zaproxy/clientapi/gen/Script.java | 52 +- .../org/zaproxy/clientapi/gen/Search.java | 62 +- .../org/zaproxy/clientapi/gen/Selenium.java | 29 +- .../clientapi/gen/SessionManagement.java | 23 +- .../org/zaproxy/clientapi/gen/Spider.java | 340 +++------ .../java/org/zaproxy/clientapi/gen/Stats.java | 70 +- .../java/org/zaproxy/clientapi/gen/Users.java | 58 +- .../gen/deprecated/AcsrfDeprecated.java | 83 +++ .../gen/deprecated/AjaxSpiderDeprecated.java | 236 ++++++ .../gen/deprecated/AscanDeprecated.java | 687 ++++++++++++++++++ .../deprecated/AuthenticationDeprecated.java | 95 +++ .../deprecated/AuthorizationDeprecated.java | 73 ++ .../gen/deprecated/AutoupdateDeprecated.java | 166 +++++ .../gen/deprecated/BreakDeprecated.java | 105 +++ .../gen/deprecated/ContextDeprecated.java | 203 ++++++ .../gen/deprecated/CoreDeprecated.java | 566 +++++++++++++++ .../gen/deprecated/ForcedUserDeprecated.java | 70 ++ .../deprecated/HttpSessionsDeprecated.java | 167 +++++ .../deprecated/ImportLogFilesDeprecated.java | 123 ++++ .../gen/deprecated/PnhDeprecated.java | 166 +++++ .../gen/deprecated/PscanDeprecated.java | 124 ++++ .../gen/deprecated/RevealDeprecated.java | 57 ++ .../gen/deprecated/ScriptDeprecated.java | 123 ++++ .../gen/deprecated/SearchDeprecated.java | 136 ++++ .../gen/deprecated/SeleniumDeprecated.java | 131 ++++ .../SessionManagementDeprecated.java | 60 ++ .../gen/deprecated/SpiderDeprecated.java | 512 +++++++++++++ .../gen/deprecated/StatsDeprecated.java | 113 +++ .../gen/deprecated/UsersDeprecated.java | 126 ++++ 57 files changed, 4873 insertions(+), 1601 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java index a989b51..977db08 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java @@ -28,7 +28,7 @@ public class ActiveScanSubtreeTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().ascan.scan(null, url, "true", "false", "", "", ""); + this.getClientApi().ascan.scan(url, "true", "false", "", "", ""); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index 2e9c743..cf8fa92 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -28,7 +28,7 @@ public class ActiveScanUrlTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().ascan.scan(null, url, "false", "false", "", "", ""); + this.getClientApi().ascan.scan(url, "false", "false", "", "", ""); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java index cc8080f..6f38a46 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java @@ -28,7 +28,7 @@ public class LoadSessionTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().core.loadSession(null, name); + this.getClientApi().core.loadSession(name); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java index 243b074..30a6d76 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java @@ -28,7 +28,7 @@ public class NewSessionTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().core.newSession(null, name, "true"); + this.getClientApi().core.newSession(name, "true"); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java index 3830bf4..9b00e1c 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java @@ -28,7 +28,7 @@ public class SaveSessionTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().core.saveSession(null, name, "true"); + this.getClientApi().core.saveSession(name, "true"); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 04d5e20..6d861fb 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -28,7 +28,7 @@ public class SpiderUrlTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().spider.scan(null, url, "", "", null, null); + this.getClientApi().spider.scan(url, "", "", null, null); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 36d7721..00fb3fd 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -26,7 +26,7 @@ public class StopZapTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().core.shutdown(null); + this.getClientApi().core.shutdown(); } catch (Exception e) { throw new BuildException(e); } diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 02ddffc..cec7886 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -43,7 +43,7 @@ public static void main(String[] args) { // Start spidering the target System.out.println("Spider : " + TARGET); // It's not necessary to pass the ZAP API key again, already set when creating the ClientApi. - ApiResponse resp = api.spider.scan(null, TARGET, null, null, null, null); + ApiResponse resp = api.spider.scan(TARGET, null, null, null, null); String scanid; int progress; @@ -65,7 +65,7 @@ public static void main(String[] args) { Thread.sleep(2000); System.out.println("Active scan : " + TARGET); - resp = api.ascan.scan(null, TARGET, "True", "False", null, null, null); + resp = api.ascan.scan(TARGET, "True", "False", null, null, null); // The scan now returns a scan id to support concurrent scanning scanid = ((ApiResponseElement) resp).getValue(); @@ -82,7 +82,7 @@ public static void main(String[] args) { System.out.println("Active Scan complete"); System.out.println("Alerts:"); - System.out.println(new String(api.core.xmlreport(null))); + System.out.println(new String(api.core.xmlreport())); } catch (Exception e) { System.out.println("Exception : " + e.getMessage()); diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java index 0ed3f11..bc91ba6 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java @@ -108,7 +108,7 @@ private static void setLoggedInIndicator(ClientApi clientApi) throws ClientApiEx String contextId = "1"; // Actually set the logged in indicator - clientApi.authentication.setLoggedInIndicator(ZAP_API_KEY, contextId, java.util.regex.Pattern.quote(loggedInIndicator)); + clientApi.authentication.setLoggedInIndicator(contextId, java.util.regex.Pattern.quote(loggedInIndicator)); // Check out the logged in indicator that is set System.out.println("Configured logged in indicator regex: " @@ -130,7 +130,7 @@ private static void setFormBasedAuthenticationForBodgeit(ClientApi clientApi) th System.out.println("Setting form based authentication configuration as: " + formBasedConfig.toString()); - clientApi.authentication.setAuthenticationMethod(ZAP_API_KEY, contextId, "formBasedAuthentication", + clientApi.authentication.setAuthenticationMethod(contextId, "formBasedAuthentication", formBasedConfig.toString()); // Check if everything is set up ok @@ -146,7 +146,7 @@ private static void setUserAuthConfigForBodgeit(ClientApi clientApi) throws Clie String password = "weakPassword"; // Make sure we have at least one user - String userId = extractUserId(clientApi.users.newUser(ZAP_API_KEY, contextId, user)); + String userId = extractUserId(clientApi.users.newUser(contextId, user)); // Prepare the configuration in a format similar to how URL parameters are formed. This // means that any value we add for the configuration values has to be URL encoded. @@ -155,7 +155,7 @@ private static void setUserAuthConfigForBodgeit(ClientApi clientApi) throws Clie userAuthConfig.append("&password=").append(URLEncoder.encode(password, "UTF-8")); System.out.println("Setting user authentication configuration as: " + userAuthConfig.toString()); - clientApi.users.setAuthenticationCredentials(ZAP_API_KEY, contextId, userId, userAuthConfig.toString()); + clientApi.users.setAuthenticationCredentials(contextId, userId, userAuthConfig.toString()); // Check if everything is set up ok System.out.println("Authentication config: " + clientApi.users.getUserById(contextId, userId).toString(0)); @@ -172,7 +172,7 @@ private static String extractUserId(ApiResponse response) { * @throws Exception if an error occurred while accessing the API */ public static void main(String[] args) throws Exception { - ClientApi clientApi = new ClientApi(ZAP_ADDRESS, ZAP_PORT); + ClientApi clientApi = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); listAuthInformation(clientApi); System.out.println("-------------"); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 951f274..7d2e50f 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -416,14 +416,48 @@ private static String encodeQueryParam(String param) { return param; } + /** + * Adds the given regular expression to the exclusion list of the given context. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to add. + * @throws Exception if an error occurred while calling the API. + * @deprecated (TODO add version) Use {@link Context#excludeFromContext(String, String)} instead. + * @see #context + */ + @Deprecated public void addExcludeFromContext(String apikey, String contextName, String regex) throws Exception { context.excludeFromContext(apikey, contextName, regex); } + /** + * Adds the given regular expression to the inclusion list of the given context. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to add. + * @throws Exception if an error occurred while calling the API. + * @deprecated (TODO add version) Use {@link Context#includeInContext(String, String)} instead. + * @see #context + */ + @Deprecated public void addIncludeInContext(String apikey, String contextName, String regex) throws Exception { context.includeInContext(apikey, contextName, regex); } + /** + * Includes just one of the nodes that match the given regular expression in the context with the given name. + *

+ * Nodes that do not match the regular expression are excluded. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to match the node/URL. + * @throws Exception if an error occurred while calling the API. + * @deprecated (TODO add version) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. + */ + @Deprecated public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) throws Exception { List sessionUrls = getSessionUrls(); boolean foundOneMatch = false; @@ -442,6 +476,32 @@ public void includeOneMatchingNodeInContext(String apikey, String contextName, S } + /** + * Includes just one of the nodes that match the given regular expression in the context with the given name. + *

+ * Nodes that do not match the regular expression are excluded. + * + * @param contextName the name of the context. + * @param regex the regular expression to match the node/URL. + * @throws Exception if an error occurred while calling the API. + */ + public void includeOneMatchingNodeInContext(String contextName, String regex) throws Exception { + List sessionUrls = getSessionUrls(); + boolean foundOneMatch = false; + for (String sessionUrl : sessionUrls) { + if (sessionUrl.matches(regex)) { + if (foundOneMatch) { + context.excludeFromContext(contextName, regex); + } else { + foundOneMatch = true; + } + } + } + if (!foundOneMatch) { + throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); + } + } + private List getSessionUrls() throws Exception { List sessionUrls = new ArrayList<>(); ApiResponse response = core.urls(); @@ -456,15 +516,45 @@ private List getSessionUrls() throws Exception { return sessionUrls; } + /** + * Active scans the given site, that's in scope. + *

+ * The method returns only after the scan has finished. + * + * @param apikey the API key, might be {@code null}. + * @param url the site to scan + * @throws Exception if an error occurred while calling the API. + * @deprecated (TODO add version) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of + * the {@code ClientApi} constructors. + */ + @Deprecated public void activeScanSiteInScope(String apikey, String url) throws Exception { ascan.scan(apikey, url, "true", "true", "", "", ""); + waitForAScanToFinish(url); + } + + /** + * Active scans the given site, that's in scope. + *

+ * The method returns only after the scan has finished. + * + * @param url the site to scan + * @throws Exception if an error occurred while calling the API. + * @since TODO add version + */ + public void activeScanSiteInScope(String url) throws Exception { + ascan.scan(url, "true", "true", "", "", ""); + waitForAScanToFinish(url); + } + + private void waitForAScanToFinish(String targetUrl) throws ClientApiException { // Poll until spider finished int status = 0; while ( status < 100) { status = statusToInt(ascan.status("")); if(debug){ String format = "Scanning %s Progress: %d%%"; - System.out.println(String.format(format, url, status)); + System.out.println(String.format(format, targetUrl, status)); }try { Thread.sleep(1000); } catch (InterruptedException e) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index 19a0d9e..ca01e9a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -56,7 +56,7 @@ private void executeTask() throws Exception { try { switch(task){ case stop: - api.core.shutdown(null); + api.core.shutdown(); break; case checkAlerts: if (params.get("alertsFile") == null){ @@ -99,13 +99,13 @@ private void executeTask() throws Exception { showHelp(); System.exit(1); } - api.core.saveSession(null, (String)params.get("sessionName"), "true"); + api.core.saveSession((String)params.get("sessionName"), "true"); break; case newSession: if (params.get("sessionName") == null){ - api.core.newSession(null, "", "true"); + api.core.newSession("", "true"); }else{ - api.core.newSession(null, (String)params.get("sessionName"), "true"); + api.core.newSession((String)params.get("sessionName"), "true"); } break; case activeScanUrl: @@ -114,27 +114,27 @@ private void executeTask() throws Exception { showHelp(); System.exit(1); }else{ - api.ascan.scan(null, (String)params.get("url"), "true", "false", "", "", ""); + api.ascan.scan((String)params.get("url"), "true", "false", "", "", ""); } break; case activeScanSiteInScope: checkForUrlParam(); - api.activeScanSiteInScope(null, (String)params.get("url")); + api.activeScanSiteInScope((String)params.get("url")); break; case addExcludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.addExcludeFromContext(null, (String)params.get("contextName"), (String)params.get("regex")); + api.context.excludeFromContext((String)params.get("contextName"), (String)params.get("regex")); break; case addIncludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.addIncludeInContext(null, (String)params.get("contextName"), (String)params.get("regex")); + api.context.includeInContext((String)params.get("contextName"), (String)params.get("regex")); break; case addIncludeOneMatchingNodeToContext: checkForContextNameParam(); checkForRegexParam(); - api.includeOneMatchingNodeInContext(null, (String)params.get("contextName"), (String)params.get("regex")); + api.includeOneMatchingNodeInContext((String)params.get("contextName"), (String)params.get("regex")); break; } } catch (ConnectException e){ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index 07412c7..343c10f 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Acsrf { +@SuppressWarnings("javadoc") +public class Acsrf extends org.zaproxy.clientapi.gen.deprecated.AcsrfDeprecated { - private ClientApi api = null; + private final ClientApi api; public Acsrf(ClientApi api) { + super(api); this.api = api; } @@ -42,19 +44,14 @@ public Acsrf(ClientApi api) { * Lists the names of all anti CSRF tokens */ public ApiResponse optionTokensNames() throws ClientApiException { - Map map = null; - return api.callApi("acsrf", "view", "optionTokensNames", map); + return api.callApi("acsrf", "view", "optionTokensNames", null); } /** * Adds an anti CSRF token with the given name, enabled by default */ - public ApiResponse addOptionToken(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse addOptionToken(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("acsrf", "action", "addOptionToken", map); } @@ -62,12 +59,8 @@ public ApiResponse addOptionToken(String apikey, String string) throws ClientApi /** * Removes the anti CSRF token with the given name */ - public ApiResponse removeOptionToken(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeOptionToken(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("acsrf", "action", "removeOptionToken", map); } @@ -75,12 +68,8 @@ public ApiResponse removeOptionToken(String apikey, String string) throws Client /** * Generate a form for testing lack of anti CSRF tokens - typically invoked via ZAP */ - public byte[] genForm(String apikey, String hrefid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] genForm(String hrefid) throws ClientApiException { + Map map = new HashMap<>(); map.put("hrefId", hrefid); return api.callApiOther("acsrf", "other", "genForm", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 4455b80..491c6c4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class AjaxSpider { +@SuppressWarnings("javadoc") +public class AjaxSpider extends org.zaproxy.clientapi.gen.deprecated.AjaxSpiderDeprecated { private final ClientApi api; public AjaxSpider(ClientApi api) { + super(api); this.api = api; } @@ -136,23 +138,13 @@ public ApiResponse optionRandomInputs() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionRandomInputs", null); } - /** - * This component is optional and therefore the API will only work if it is installed. - */ - public ApiResponse scan(String apikey, String url, String inscope) throws ClientApiException { - return scan(apikey, url, inscope, null, null); - } - /** * Runs the spider against the given URL and/or context, optionally, spidering everything in scope. The parameter 'contextName' can be used to constrain the scan to a Context, the option 'in scope' is ignored if a context was also specified. The parameter 'subtreeOnly' allows to restrict the spider under a site's subtree (using the specified 'url'). *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse scan(String apikey, String url, String inscope, String contextname, String subtreeonly) throws ClientApiException { + public ApiResponse scan(String url, String inscope, String contextname, String subtreeonly) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } if (url != null) { map.put("url", url); } @@ -173,11 +165,8 @@ public ApiResponse scan(String apikey, String url, String inscope, String contex *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse scanAsUser(String apikey, String contextname, String username, String url, String subtreeonly) throws ClientApiException { + public ApiResponse scanAsUser(String contextname, String username, String url, String subtreeonly) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("contextName", contextname); map.put("userName", username); if (url != null) { @@ -192,22 +181,15 @@ public ApiResponse scanAsUser(String apikey, String contextname, String username /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse stop(String apikey) throws ClientApiException { - Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ajaxSpider", "action", "stop", map); + public ApiResponse stop() throws ClientApiException { + return api.callApi("ajaxSpider", "action", "stop", null); } /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionBrowserId(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionBrowserId(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("ajaxSpider", "action", "setOptionBrowserId", map); } @@ -215,11 +197,8 @@ public ApiResponse setOptionBrowserId(String apikey, String string) throws Clien /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionClickDefaultElems(boolean bool) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionClickDefaultElems", map); } @@ -227,11 +206,8 @@ public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throw /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionClickElemsOnce(boolean bool) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); } @@ -239,11 +215,8 @@ public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws C /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionEventWait(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionEventWait", map); } @@ -251,11 +224,8 @@ public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionMaxCrawlDepth(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlDepth", map); } @@ -263,11 +233,8 @@ public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApi /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionMaxCrawlStates(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlStates", map); } @@ -275,11 +242,8 @@ public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientAp /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxDuration", map); } @@ -287,11 +251,8 @@ public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionNumberOfBrowsers(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionNumberOfBrowsers", map); } @@ -299,11 +260,8 @@ public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws Client /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionRandomInputs(boolean bool) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionRandomInputs", map); } @@ -311,11 +269,8 @@ public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws Cli /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionReloadWait(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionReloadWait(int i) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionReloadWait", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 47e13df..8f593de 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -30,6 +30,7 @@ /** * This file was automatically generated. */ +@SuppressWarnings("javadoc") public class AlertFilter { private final ClientApi api; @@ -52,11 +53,8 @@ public ApiResponse alertFilterList(String contextid) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse addAlertFilter(String apikey, String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { + public ApiResponse addAlertFilter(String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("contextId", contextid); map.put("ruleId", ruleid); map.put("newLevel", newlevel); @@ -78,11 +76,8 @@ public ApiResponse addAlertFilter(String apikey, String contextid, String ruleid /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse removeAlertFilter(String apikey, String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { + public ApiResponse removeAlertFilter(String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("contextId", contextid); map.put("ruleId", ruleid); map.put("newLevel", newlevel); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index 29ef0b5..f5a98f3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -30,17 +30,18 @@ /** * This file was automatically generated. */ -public class Ascan { +@SuppressWarnings("javadoc") +public class Ascan extends org.zaproxy.clientapi.gen.deprecated.AscanDeprecated { - private ClientApi api = null; + private final ClientApi api; public Ascan(ClientApi api) { + super(api); this.api = api; } public ApiResponse status(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanid != null) { map.put("scanId", scanid); } @@ -48,8 +49,7 @@ public ApiResponse status(String scanid) throws ClientApiException { } public ApiResponse scanProgress(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanid != null) { map.put("scanId", scanid); } @@ -57,37 +57,31 @@ public ApiResponse scanProgress(String scanid) throws ClientApiException { } public ApiResponse messagesIds(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "view", "messagesIds", map); } public ApiResponse alertsIds(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "view", "alertsIds", map); } public ApiResponse scans() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "scans", map); + return api.callApi("ascan", "view", "scans", null); } public ApiResponse scanPolicyNames() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "scanPolicyNames", map); + return api.callApi("ascan", "view", "scanPolicyNames", null); } public ApiResponse excludedFromScan() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "excludedFromScan", map); + return api.callApi("ascan", "view", "excludedFromScan", null); } public ApiResponse scanners(String scanpolicyname, String policyid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); } @@ -98,8 +92,7 @@ public ApiResponse scanners(String scanpolicyname, String policyid) throws Clien } public ApiResponse policies(String scanpolicyname, String policyid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); } @@ -110,114 +103,90 @@ public ApiResponse policies(String scanpolicyname, String policyid) throws Clien } public ApiResponse attackModeQueue() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "attackModeQueue", map); + return api.callApi("ascan", "view", "attackModeQueue", null); } public ApiResponse optionAttackPolicy() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionAttackPolicy", map); + return api.callApi("ascan", "view", "optionAttackPolicy", null); } public ApiResponse optionDefaultPolicy() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionDefaultPolicy", map); + return api.callApi("ascan", "view", "optionDefaultPolicy", null); } public ApiResponse optionDelayInMs() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionDelayInMs", map); + return api.callApi("ascan", "view", "optionDelayInMs", null); } public ApiResponse optionExcludedParamList() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionExcludedParamList", map); + return api.callApi("ascan", "view", "optionExcludedParamList", null); } public ApiResponse optionHandleAntiCSRFTokens() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionHandleAntiCSRFTokens", map); + return api.callApi("ascan", "view", "optionHandleAntiCSRFTokens", null); } public ApiResponse optionHostPerScan() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionHostPerScan", map); + return api.callApi("ascan", "view", "optionHostPerScan", null); } public ApiResponse optionMaxChartTimeInMins() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionMaxChartTimeInMins", map); + return api.callApi("ascan", "view", "optionMaxChartTimeInMins", null); } public ApiResponse optionMaxResultsToList() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionMaxResultsToList", map); + return api.callApi("ascan", "view", "optionMaxResultsToList", null); } public ApiResponse optionMaxScansInUI() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionMaxScansInUI", map); + return api.callApi("ascan", "view", "optionMaxScansInUI", null); } public ApiResponse optionTargetParamsEnabledRPC() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionTargetParamsEnabledRPC", map); + return api.callApi("ascan", "view", "optionTargetParamsEnabledRPC", null); } public ApiResponse optionTargetParamsInjectable() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionTargetParamsInjectable", map); + return api.callApi("ascan", "view", "optionTargetParamsInjectable", null); } public ApiResponse optionThreadPerHost() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionThreadPerHost", map); + return api.callApi("ascan", "view", "optionThreadPerHost", null); } public ApiResponse optionAllowAttackOnStart() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionAllowAttackOnStart", map); + return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); } public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", map); + return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); } public ApiResponse optionPromptInAttackMode() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionPromptInAttackMode", map); + return api.callApi("ascan", "view", "optionPromptInAttackMode", null); } public ApiResponse optionPromptToClearFinishedScans() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionPromptToClearFinishedScans", map); + return api.callApi("ascan", "view", "optionPromptToClearFinishedScans", null); } public ApiResponse optionRescanInAttackMode() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionRescanInAttackMode", map); + return api.callApi("ascan", "view", "optionRescanInAttackMode", null); } /** * Tells whether or not the HTTP Headers of all requests should be scanned. Not just requests that send parameters, through the query or request body. */ public ApiResponse optionScanHeadersAllRequests() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionScanHeadersAllRequests", map); + return api.callApi("ascan", "view", "optionScanHeadersAllRequests", null); } public ApiResponse optionShowAdvancedDialog() throws ClientApiException { - Map map = null; - return api.callApi("ascan", "view", "optionShowAdvancedDialog", map); + return api.callApi("ascan", "view", "optionShowAdvancedDialog", null); } - public ApiResponse scan(String apikey, String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse scan(String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata) throws ClientApiException { + Map map = new HashMap<>(); map.put("url", url); if (recurse != null) { map.put("recurse", recurse); @@ -240,12 +209,8 @@ public ApiResponse scan(String apikey, String url, String recurse, String inscop /** * Active Scans from the perspective of a User, obtained using the given Context ID and User ID. See 'scan' action for more details. */ - public ApiResponse scanAsUser(String apikey, String url, String contextid, String userid, String recurse, String scanpolicyname, String method, String postdata) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse scanAsUser(String url, String contextid, String userid, String recurse, String scanpolicyname, String method, String postdata) throws ClientApiException { + Map map = new HashMap<>(); map.put("url", url); map.put("contextId", contextid); map.put("userId", userid); @@ -264,131 +229,74 @@ public ApiResponse scanAsUser(String apikey, String url, String contextid, Strin return api.callApi("ascan", "action", "scanAsUser", map); } - public ApiResponse pause(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse pause(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "action", "pause", map); } - public ApiResponse resume(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse resume(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "action", "resume", map); } - public ApiResponse stop(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse stop(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "action", "stop", map); } - public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeScan(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "action", "removeScan", map); } - public ApiResponse pauseAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ascan", "action", "pauseAllScans", map); + public ApiResponse pauseAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "pauseAllScans", null); } - public ApiResponse resumeAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ascan", "action", "resumeAllScans", map); + public ApiResponse resumeAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "resumeAllScans", null); } - public ApiResponse stopAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ascan", "action", "stopAllScans", map); + public ApiResponse stopAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "stopAllScans", null); } - public ApiResponse removeAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ascan", "action", "removeAllScans", map); + public ApiResponse removeAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "removeAllScans", null); } - public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("ascan", "action", "clearExcludedFromScan", map); + public ApiResponse clearExcludedFromScan() throws ClientApiException { + return api.callApi("ascan", "action", "clearExcludedFromScan", null); } - public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeFromScan(String regex) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); return api.callApi("ascan", "action", "excludeFromScan", map); } - public ApiResponse enableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); } return api.callApi("ascan", "action", "enableAllScanners", map); } - public ApiResponse disableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); } return api.callApi("ascan", "action", "disableAllScanners", map); } - public ApiResponse enableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse enableScanners(String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("ids", ids); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); @@ -396,12 +304,8 @@ public ApiResponse enableScanners(String apikey, String ids, String scanpolicyna return api.callApi("ascan", "action", "enableScanners", map); } - public ApiResponse disableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse disableScanners(String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("ids", ids); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); @@ -409,12 +313,8 @@ public ApiResponse disableScanners(String apikey, String ids, String scanpolicyn return api.callApi("ascan", "action", "disableScanners", map); } - public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setEnabledPolicies(String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("ids", ids); if (scanpolicyname != null) { map.put("scanPolicyName", scanpolicyname); @@ -422,12 +322,8 @@ public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpoli return api.callApi("ascan", "action", "setEnabledPolicies", map); } - public ApiResponse setPolicyAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setPolicyAttackStrength(String id, String attackstrength, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("attackStrength", attackstrength); if (scanpolicyname != null) { @@ -436,12 +332,8 @@ public ApiResponse setPolicyAttackStrength(String apikey, String id, String atta return api.callApi("ascan", "action", "setPolicyAttackStrength", map); } - public ApiResponse setPolicyAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setPolicyAlertThreshold(String id, String alertthreshold, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("alertThreshold", alertthreshold); if (scanpolicyname != null) { @@ -450,12 +342,8 @@ public ApiResponse setPolicyAlertThreshold(String apikey, String id, String aler return api.callApi("ascan", "action", "setPolicyAlertThreshold", map); } - public ApiResponse setScannerAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setScannerAttackStrength(String id, String attackstrength, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("attackStrength", attackstrength); if (scanpolicyname != null) { @@ -464,12 +352,8 @@ public ApiResponse setScannerAttackStrength(String apikey, String id, String att return api.callApi("ascan", "action", "setScannerAttackStrength", map); } - public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setScannerAlertThreshold(String id, String alertthreshold, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("alertThreshold", alertthreshold); if (scanpolicyname != null) { @@ -478,152 +362,92 @@ public ApiResponse setScannerAlertThreshold(String apikey, String id, String ale return api.callApi("ascan", "action", "setScannerAlertThreshold", map); } - public ApiResponse addScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanPolicyName", scanpolicyname); return api.callApi("ascan", "action", "addScanPolicy", map); } - public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeScanPolicy(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanPolicyName", scanpolicyname); return api.callApi("ascan", "action", "removeScanPolicy", map); } - public ApiResponse setOptionAttackPolicy(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionAttackPolicy(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("ascan", "action", "setOptionAttackPolicy", map); } - public ApiResponse setOptionDefaultPolicy(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionDefaultPolicy(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("ascan", "action", "setOptionDefaultPolicy", map); } - public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); } - public ApiResponse setOptionDelayInMs(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionDelayInMs", map); } - public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionHandleAntiCSRFTokens(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionHandleAntiCSRFTokens", map); } - public ApiResponse setOptionHostPerScan(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionHostPerScan(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionHostPerScan", map); } - public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionInjectPluginIdInHeader", map); } - public ApiResponse setOptionMaxChartTimeInMins(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxChartTimeInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionMaxChartTimeInMins", map); } - public ApiResponse setOptionMaxResultsToList(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxResultsToList(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionMaxResultsToList", map); } - public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionMaxScansInUI", map); } - public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionPromptInAttackMode(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionPromptInAttackMode", map); } - public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionPromptToClearFinishedScans(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionPromptToClearFinishedScans", map); } - public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionRescanInAttackMode(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionRescanInAttackMode", map); } @@ -631,52 +455,32 @@ public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) thro /** * Sets whether or not the HTTP Headers of all requests should be scanned. Not just requests that send parameters, through the query or request body. */ - public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionScanHeadersAllRequests(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionScanHeadersAllRequests", map); } - public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ascan", "action", "setOptionShowAdvancedDialog", map); } - public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionTargetParamsEnabledRPC(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionTargetParamsEnabledRPC", map); } - public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionTargetParamsInjectable(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionTargetParamsInjectable", map); } - public ApiResponse setOptionThreadPerHost(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionThreadPerHost(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionThreadPerHost", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java index f22fca2..c778f65 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java @@ -30,53 +30,46 @@ /** * This file was automatically generated. */ -public class Authentication { +@SuppressWarnings("javadoc") +public class Authentication extends org.zaproxy.clientapi.gen.deprecated.AuthenticationDeprecated { - private ClientApi api = null; + private final ClientApi api; public Authentication(ClientApi api) { + super(api); this.api = api; } public ApiResponse getSupportedAuthenticationMethods() throws ClientApiException { - Map map = null; - return api.callApi("authentication", "view", "getSupportedAuthenticationMethods", map); + return api.callApi("authentication", "view", "getSupportedAuthenticationMethods", null); } public ApiResponse getAuthenticationMethodConfigParams(String authmethodname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("authMethodName", authmethodname); return api.callApi("authentication", "view", "getAuthenticationMethodConfigParams", map); } public ApiResponse getAuthenticationMethod(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getAuthenticationMethod", map); } public ApiResponse getLoggedInIndicator(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getLoggedInIndicator", map); } public ApiResponse getLoggedOutIndicator(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getLoggedOutIndicator", map); } - public ApiResponse setAuthenticationMethod(String apikey, String contextid, String authmethodname, String authmethodconfigparams) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setAuthenticationMethod(String contextid, String authmethodname, String authmethodconfigparams) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("authMethodName", authmethodname); if (authmethodconfigparams != null) { @@ -85,23 +78,15 @@ public ApiResponse setAuthenticationMethod(String apikey, String contextid, Stri return api.callApi("authentication", "action", "setAuthenticationMethod", map); } - public ApiResponse setLoggedInIndicator(String apikey, String contextid, String loggedinindicatorregex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setLoggedInIndicator(String contextid, String loggedinindicatorregex) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("loggedInIndicatorRegex", loggedinindicatorregex); return api.callApi("authentication", "action", "setLoggedInIndicator", map); } - public ApiResponse setLoggedOutIndicator(String apikey, String contextid, String loggedoutindicatorregex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setLoggedOutIndicator(String contextid, String loggedoutindicatorregex) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("loggedOutIndicatorRegex", loggedoutindicatorregex); return api.callApi("authentication", "action", "setLoggedOutIndicator", map); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java index ad5f698..0d8a3a3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Authorization { +@SuppressWarnings("javadoc") +public class Authorization extends org.zaproxy.clientapi.gen.deprecated.AuthorizationDeprecated { - private ClientApi api = null; + private final ClientApi api; public Authorization(ClientApi api) { + super(api); this.api = api; } @@ -42,8 +44,7 @@ public Authorization(ClientApi api) { * Obtains all the configuration of the authorization detection method that is currently set for a context. */ public ApiResponse getAuthorizationDetectionMethod(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authorization", "view", "getAuthorizationDetectionMethod", map); } @@ -51,12 +52,8 @@ public ApiResponse getAuthorizationDetectionMethod(String contextid) throws Clie /** * Sets the authorization detection method for a context as one that identifies un-authorized messages based on: the message's status code or a regex pattern in the response's header or body. Also, whether all conditions must match or just some can be specified via the logicalOperator parameter, which accepts two values: "AND" (default), "OR". */ - public ApiResponse setBasicAuthorizationDetectionMethod(String apikey, String contextid, String headerregex, String bodyregex, String statuscode, String logicaloperator) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setBasicAuthorizationDetectionMethod(String contextid, String headerregex, String bodyregex, String statuscode, String logicaloperator) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); if (headerregex != null) { map.put("headerRegex", headerregex); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index 3f341ff..f59818d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Autoupdate { +@SuppressWarnings("javadoc") +public class Autoupdate extends org.zaproxy.clientapi.gen.deprecated.AutoupdateDeprecated { - private ClientApi api = null; + private final ClientApi api; public Autoupdate(ClientApi api) { + super(api); this.api = api; } @@ -42,171 +44,119 @@ public Autoupdate(ClientApi api) { * Returns the latest version number */ public ApiResponse latestVersionNumber() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "latestVersionNumber", map); + return api.callApi("autoupdate", "view", "latestVersionNumber", null); } /** * Returns 'true' if ZAP is on the latest version */ public ApiResponse isLatestVersion() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "isLatestVersion", map); + return api.callApi("autoupdate", "view", "isLatestVersion", null); } public ApiResponse optionAddonDirectories() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionAddonDirectories", map); + return api.callApi("autoupdate", "view", "optionAddonDirectories", null); } public ApiResponse optionDayLastChecked() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionDayLastChecked", map); + return api.callApi("autoupdate", "view", "optionDayLastChecked", null); } public ApiResponse optionDayLastInstallWarned() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionDayLastInstallWarned", map); + return api.callApi("autoupdate", "view", "optionDayLastInstallWarned", null); } public ApiResponse optionDayLastUpdateWarned() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionDayLastUpdateWarned", map); + return api.callApi("autoupdate", "view", "optionDayLastUpdateWarned", null); } public ApiResponse optionDownloadDirectory() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionDownloadDirectory", map); + return api.callApi("autoupdate", "view", "optionDownloadDirectory", null); } public ApiResponse optionCheckAddonUpdates() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionCheckAddonUpdates", map); + return api.callApi("autoupdate", "view", "optionCheckAddonUpdates", null); } public ApiResponse optionCheckOnStart() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionCheckOnStart", map); + return api.callApi("autoupdate", "view", "optionCheckOnStart", null); } public ApiResponse optionDownloadNewRelease() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionDownloadNewRelease", map); + return api.callApi("autoupdate", "view", "optionDownloadNewRelease", null); } public ApiResponse optionInstallAddonUpdates() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionInstallAddonUpdates", map); + return api.callApi("autoupdate", "view", "optionInstallAddonUpdates", null); } public ApiResponse optionInstallScannerRules() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionInstallScannerRules", map); + return api.callApi("autoupdate", "view", "optionInstallScannerRules", null); } public ApiResponse optionReportAlphaAddons() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionReportAlphaAddons", map); + return api.callApi("autoupdate", "view", "optionReportAlphaAddons", null); } public ApiResponse optionReportBetaAddons() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionReportBetaAddons", map); + return api.callApi("autoupdate", "view", "optionReportBetaAddons", null); } public ApiResponse optionReportReleaseAddons() throws ClientApiException { - Map map = null; - return api.callApi("autoupdate", "view", "optionReportReleaseAddons", map); + return api.callApi("autoupdate", "view", "optionReportReleaseAddons", null); } /** * Downloads the latest release, if any */ - public ApiResponse downloadLatestRelease(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("autoupdate", "action", "downloadLatestRelease", map); - } - - public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse downloadLatestRelease() throws ClientApiException { + return api.callApi("autoupdate", "action", "downloadLatestRelease", null); + } + + public ApiResponse setOptionCheckAddonUpdates(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionCheckAddonUpdates", map); } - public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionCheckOnStart(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionCheckOnStart", map); } - public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionDownloadNewRelease(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionDownloadNewRelease", map); } - public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionInstallAddonUpdates(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionInstallAddonUpdates", map); } - public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionInstallScannerRules(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionInstallScannerRules", map); } - public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionReportAlphaAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionReportAlphaAddons", map); } - public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionReportBetaAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionReportBetaAddons", map); } - public ApiResponse setOptionReportReleaseAddons(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionReportReleaseAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionReportReleaseAddons", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index 213234c..c70b1ed 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -30,32 +30,26 @@ /** * This file was automatically generated. */ -public class Break { +@SuppressWarnings("javadoc") +public class Break extends org.zaproxy.clientapi.gen.deprecated.BreakDeprecated { - private ClientApi api = null; + private final ClientApi api; public Break(ClientApi api) { + super(api); this.api = api; } - public ApiResponse brk(String apikey, String type, String scope, String state) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse brk(String type, String scope, String state) throws ClientApiException { + Map map = new HashMap<>(); map.put("type", type); map.put("scope", scope); map.put("state", state); return api.callApi("break", "action", "break", map); } - public ApiResponse addHttpBreakpoint(String apikey, String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse addHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { + Map map = new HashMap<>(); map.put("string", string); map.put("location", location); map.put("match", match); @@ -64,12 +58,8 @@ public ApiResponse addHttpBreakpoint(String apikey, String string, String locati return api.callApi("break", "action", "addHttpBreakpoint", map); } - public ApiResponse removeHttpBreakpoint(String apikey, String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { + Map map = new HashMap<>(); map.put("string", string); map.put("location", location); map.put("match", match); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 2d087a1..010c735 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Context { +@SuppressWarnings("javadoc") +public class Context extends org.zaproxy.clientapi.gen.deprecated.ContextDeprecated { - private ClientApi api = null; + private final ClientApi api; public Context(ClientApi api) { + super(api); this.api = api; } @@ -42,16 +44,14 @@ public Context(ClientApi api) { * List context names of current session */ public ApiResponse contextList() throws ClientApiException { - Map map = null; - return api.callApi("context", "view", "contextList", map); + return api.callApi("context", "view", "contextList", null); } /** * List excluded regexs for context */ public ApiResponse excludeRegexs(String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "view", "excludeRegexs", map); } @@ -60,8 +60,7 @@ public ApiResponse excludeRegexs(String contextname) throws ClientApiException { * List included regexs for context */ public ApiResponse includeRegexs(String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "view", "includeRegexs", map); } @@ -70,8 +69,7 @@ public ApiResponse includeRegexs(String contextname) throws ClientApiException { * List the information about the named context */ public ApiResponse context(String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "view", "context", map); } @@ -80,16 +78,14 @@ public ApiResponse context(String contextname) throws ClientApiException { * Lists the names of all built in technologies */ public ApiResponse technologyList() throws ClientApiException { - Map map = null; - return api.callApi("context", "view", "technologyList", map); + return api.callApi("context", "view", "technologyList", null); } /** * Lists the names of all technologies included in a context */ public ApiResponse includedTechnologyList(String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "view", "includedTechnologyList", map); } @@ -98,8 +94,7 @@ public ApiResponse includedTechnologyList(String contextname) throws ClientApiEx * Lists the names of all technologies excluded from a context */ public ApiResponse excludedTechnologyList(String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "view", "excludedTechnologyList", map); } @@ -107,12 +102,8 @@ public ApiResponse excludedTechnologyList(String contextname) throws ClientApiEx /** * Add exclude regex to context */ - public ApiResponse excludeFromContext(String apikey, String contextname, String regex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeFromContext(String contextname, String regex) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("regex", regex); return api.callApi("context", "action", "excludeFromContext", map); @@ -121,12 +112,8 @@ public ApiResponse excludeFromContext(String apikey, String contextname, String /** * Add include regex to context */ - public ApiResponse includeInContext(String apikey, String contextname, String regex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse includeInContext(String contextname, String regex) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("regex", regex); return api.callApi("context", "action", "includeInContext", map); @@ -135,12 +122,8 @@ public ApiResponse includeInContext(String apikey, String contextname, String re /** * Creates a new context with the given name in the current session */ - public ApiResponse newContext(String apikey, String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse newContext(String contextname) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "action", "newContext", map); } @@ -148,12 +131,8 @@ public ApiResponse newContext(String apikey, String contextname) throws ClientAp /** * Removes a context in the current session */ - public ApiResponse removeContext(String apikey, String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeContext(String contextname) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "action", "removeContext", map); } @@ -161,12 +140,8 @@ public ApiResponse removeContext(String apikey, String contextname) throws Clien /** * Exports the context with the given name to a file. If a relative file path is specified it will be resolved against the "contexts" directory in ZAP "home" dir. */ - public ApiResponse exportContext(String apikey, String contextname, String contextfile) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse exportContext(String contextname, String contextfile) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("contextFile", contextfile); return api.callApi("context", "action", "exportContext", map); @@ -175,12 +150,8 @@ public ApiResponse exportContext(String apikey, String contextname, String conte /** * Imports a context from a file. If a relative file path is specified it will be resolved against the "contexts" directory in ZAP "home" dir. */ - public ApiResponse importContext(String apikey, String contextfile) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse importContext(String contextfile) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextFile", contextfile); return api.callApi("context", "action", "importContext", map); } @@ -188,12 +159,8 @@ public ApiResponse importContext(String apikey, String contextfile) throws Clien /** * Includes technologies with the given names, separated by a comma, to a context */ - public ApiResponse includeContextTechnologies(String apikey, String contextname, String technologynames) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse includeContextTechnologies(String contextname, String technologynames) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("technologyNames", technologynames); return api.callApi("context", "action", "includeContextTechnologies", map); @@ -202,12 +169,8 @@ public ApiResponse includeContextTechnologies(String apikey, String contextname, /** * Includes all built in technologies in to a context */ - public ApiResponse includeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse includeAllContextTechnologies(String contextname) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "action", "includeAllContextTechnologies", map); } @@ -215,12 +178,8 @@ public ApiResponse includeAllContextTechnologies(String apikey, String contextna /** * Excludes technologies with the given names, separated by a comma, from a context */ - public ApiResponse excludeContextTechnologies(String apikey, String contextname, String technologynames) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeContextTechnologies(String contextname, String technologynames) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("technologyNames", technologynames); return api.callApi("context", "action", "excludeContextTechnologies", map); @@ -229,12 +188,8 @@ public ApiResponse excludeContextTechnologies(String apikey, String contextname, /** * Excludes all built in technologies from a context */ - public ApiResponse excludeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeAllContextTechnologies(String contextname) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); return api.callApi("context", "action", "excludeAllContextTechnologies", map); } @@ -242,12 +197,8 @@ public ApiResponse excludeAllContextTechnologies(String apikey, String contextna /** * Sets a context to in scope (contexts are in scope by default) */ - public ApiResponse setContextInScope(String apikey, String contextname, String booleaninscope) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setContextInScope(String contextname, String booleaninscope) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextName", contextname); map.put("booleanInScope", booleaninscope); return api.callApi("context", "action", "setContextInScope", map); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 22186a4..13b7e59 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Core { +@SuppressWarnings("javadoc") +public class Core extends org.zaproxy.clientapi.gen.deprecated.CoreDeprecated { - private ClientApi api = null; + private final ClientApi api; public Core(ClientApi api) { + super(api); this.api = api; } @@ -42,8 +44,7 @@ public Core(ClientApi api) { * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the 'messageId' field and 'message' API method */ public ApiResponse alert(String id) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("id", id); return api.callApi("core", "view", "alert", map); } @@ -52,8 +53,7 @@ public ApiResponse alert(String id) throws ClientApiException { * Gets the alerts raised by ZAP, optionally filtering by URL and paginating with 'start' position and 'count' of alerts */ public ApiResponse alerts(String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } @@ -70,8 +70,7 @@ public ApiResponse alerts(String baseurl, String start, String count) throws Cli * Gets the number of alerts, optionally filtering by URL */ public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } @@ -82,32 +81,28 @@ public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { * Gets the name of the hosts accessed through/by ZAP */ public ApiResponse hosts() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "hosts", map); + return api.callApi("core", "view", "hosts", null); } /** * Gets the sites accessed through/by ZAP (scheme and domain) */ public ApiResponse sites() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "sites", map); + return api.callApi("core", "view", "sites", null); } /** * Gets the URLs accessed through/by ZAP */ public ApiResponse urls() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "urls", map); + return api.callApi("core", "view", "urls", null); } /** * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, cookies and note. */ public ApiResponse message(String id) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("id", id); return api.callApi("core", "view", "message", map); } @@ -116,8 +111,7 @@ public ApiResponse message(String id) throws ClientApiException { * Gets the HTTP messages sent by ZAP, request and response, optionally filtered by URL and paginated with 'start' position and 'count' of messages */ public ApiResponse messages(String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } @@ -134,8 +128,7 @@ public ApiResponse messages(String baseurl, String start, String count) throws C * Gets the number of messages, optionally filtering by URL */ public ApiResponse numberOfMessages(String baseurl) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } @@ -146,120 +139,96 @@ public ApiResponse numberOfMessages(String baseurl) throws ClientApiException { * Gets the mode */ public ApiResponse mode() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "mode", map); + return api.callApi("core", "view", "mode", null); } /** * Gets ZAP version */ public ApiResponse version() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "version", map); + return api.callApi("core", "view", "version", null); } /** * Gets the regular expressions, applied to URLs, to exclude from the Proxy */ public ApiResponse excludedFromProxy() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "excludedFromProxy", map); + return api.callApi("core", "view", "excludedFromProxy", null); } public ApiResponse homeDirectory() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "homeDirectory", map); + return api.callApi("core", "view", "homeDirectory", null); } public ApiResponse optionDefaultUserAgent() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionDefaultUserAgent", map); + return api.callApi("core", "view", "optionDefaultUserAgent", null); } public ApiResponse optionHttpState() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionHttpState", map); + return api.callApi("core", "view", "optionHttpState", null); } public ApiResponse optionProxyChainName() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainName", map); + return api.callApi("core", "view", "optionProxyChainName", null); } public ApiResponse optionProxyChainPassword() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainPassword", map); + return api.callApi("core", "view", "optionProxyChainPassword", null); } public ApiResponse optionProxyChainPort() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainPort", map); + return api.callApi("core", "view", "optionProxyChainPort", null); } public ApiResponse optionProxyChainRealm() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainRealm", map); + return api.callApi("core", "view", "optionProxyChainRealm", null); } public ApiResponse optionProxyChainSkipName() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainSkipName", map); + return api.callApi("core", "view", "optionProxyChainSkipName", null); } public ApiResponse optionProxyChainUserName() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainUserName", map); + return api.callApi("core", "view", "optionProxyChainUserName", null); } public ApiResponse optionProxyExcludedDomains() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyExcludedDomains", map); + return api.callApi("core", "view", "optionProxyExcludedDomains", null); } public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", map); + return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); } public ApiResponse optionTimeoutInSecs() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionTimeoutInSecs", map); + return api.callApi("core", "view", "optionTimeoutInSecs", null); } public ApiResponse optionHttpStateEnabled() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionHttpStateEnabled", map); + return api.callApi("core", "view", "optionHttpStateEnabled", null); } public ApiResponse optionProxyChainPrompt() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionProxyChainPrompt", map); + return api.callApi("core", "view", "optionProxyChainPrompt", null); } public ApiResponse optionSingleCookieRequestHeader() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionSingleCookieRequestHeader", map); + return api.callApi("core", "view", "optionSingleCookieRequestHeader", null); } public ApiResponse optionUseProxyChain() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionUseProxyChain", map); + return api.callApi("core", "view", "optionUseProxyChain", null); } public ApiResponse optionUseProxyChainAuth() throws ClientApiException { - Map map = null; - return api.callApi("core", "view", "optionUseProxyChainAuth", map); + return api.callApi("core", "view", "optionUseProxyChainAuth", null); } /** * Convenient and simple action to access a URL, optionally following redirections. Returns the request sent and response received and followed redirections, if any. Other actions are available which offer more control on what is sent, like, 'sendRequest' or 'sendHarRequest'. */ - public ApiResponse accessUrl(String apikey, String url, String followredirects) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse accessUrl(String url, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); map.put("url", url); if (followredirects != null) { map.put("followRedirects", followredirects); @@ -270,24 +239,15 @@ public ApiResponse accessUrl(String apikey, String url, String followredirects) /** * Shuts down ZAP */ - public ApiResponse shutdown(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "shutdown", map); + public ApiResponse shutdown() throws ClientApiException { + return api.callApi("core", "action", "shutdown", null); } /** * Creates a new session, optionally overwriting existing files. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. */ - public ApiResponse newSession(String apikey, String name, String overwrite) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse newSession(String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); if (name != null) { map.put("name", name); } @@ -300,12 +260,8 @@ public ApiResponse newSession(String apikey, String name, String overwrite) thro /** * Loads the session with the given name. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. */ - public ApiResponse loadSession(String apikey, String name) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse loadSession(String name) throws ClientApiException { + Map map = new HashMap<>(); map.put("name", name); return api.callApi("core", "action", "loadSession", map); } @@ -313,12 +269,8 @@ public ApiResponse loadSession(String apikey, String name) throws ClientApiExcep /** * Saves the session with the name supplied, optionally overwriting existing files. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. */ - public ApiResponse saveSession(String apikey, String name, String overwrite) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse saveSession(String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); map.put("name", name); if (overwrite != null) { map.put("overwrite", overwrite); @@ -326,40 +278,22 @@ public ApiResponse saveSession(String apikey, String name, String overwrite) thr return api.callApi("core", "action", "saveSession", map); } - public ApiResponse snapshotSession(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "snapshotSession", map); + public ApiResponse snapshotSession() throws ClientApiException { + return api.callApi("core", "action", "snapshotSession", null); } - public ApiResponse clearExcludedFromProxy(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "clearExcludedFromProxy", map); + public ApiResponse clearExcludedFromProxy() throws ClientApiException { + return api.callApi("core", "action", "clearExcludedFromProxy", null); } - public ApiResponse excludeFromProxy(String apikey, String regex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeFromProxy(String regex) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); return api.callApi("core", "action", "excludeFromProxy", map); } - public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setHomeDirectory(String dir) throws ClientApiException { + Map map = new HashMap<>(); map.put("dir", dir); return api.callApi("core", "action", "setHomeDirectory", map); } @@ -367,34 +301,21 @@ public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiE /** * Sets the mode, which may be one of [safe, protect, standard, attack] */ - public ApiResponse setMode(String apikey, String mode) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setMode(String mode) throws ClientApiException { + Map map = new HashMap<>(); map.put("mode", mode); return api.callApi("core", "action", "setMode", map); } - public ApiResponse generateRootCA(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "generateRootCA", map); + public ApiResponse generateRootCA() throws ClientApiException { + return api.callApi("core", "action", "generateRootCA", null); } /** * Sends the HTTP request, optionally following redirections. Returns the request sent and response received and followed redirections, if any. */ - public ApiResponse sendRequest(String apikey, String request, String followredirects) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse sendRequest(String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); map.put("request", request); if (followredirects != null) { map.put("followRedirects", followredirects); @@ -402,33 +323,19 @@ public ApiResponse sendRequest(String apikey, String request, String followredir return api.callApi("core", "action", "sendRequest", map); } - public ApiResponse deleteAllAlerts(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "deleteAllAlerts", map); + public ApiResponse deleteAllAlerts() throws ClientApiException { + return api.callApi("core", "action", "deleteAllAlerts", null); } - public ApiResponse runGarbageCollection(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("core", "action", "runGarbageCollection", map); + public ApiResponse runGarbageCollection() throws ClientApiException { + return api.callApi("core", "action", "runGarbageCollection", null); } /** * Deletes the site node found in the Sites Tree on the basis of the URL, HTTP method, and post data (if applicable and specified). */ - public ApiResponse deleteSiteNode(String apikey, String url, String method, String postdata) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse deleteSiteNode(String url, String method, String postdata) throws ClientApiException { + Map map = new HashMap<>(); map.put("url", url); if (method != null) { map.put("method", method); @@ -439,160 +346,94 @@ public ApiResponse deleteSiteNode(String apikey, String url, String method, Stri return api.callApi("core", "action", "deleteSiteNode", map); } - public ApiResponse setOptionDefaultUserAgent(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionDefaultUserAgent", map); } - public ApiResponse setOptionProxyChainName(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainName(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainName", map); } - public ApiResponse setOptionProxyChainPassword(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainPassword", map); } - public ApiResponse setOptionProxyChainRealm(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainRealm", map); } - public ApiResponse setOptionProxyChainSkipName(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainSkipName", map); } - public ApiResponse setOptionProxyChainUserName(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainUserName", map); } - public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionHttpStateEnabled", map); } - public ApiResponse setOptionProxyChainPort(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("core", "action", "setOptionProxyChainPort", map); } - public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionProxyChainPrompt", map); } - public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); } - public ApiResponse setOptionTimeoutInSecs(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("core", "action", "setOptionTimeoutInSecs", map); } - public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionUseProxyChain", map); } - public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); } - public byte[] proxypac(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("core", "other", "proxy.pac", map); + public byte[] proxypac() throws ClientApiException { + return api.callApiOther("core", "other", "proxy.pac", null); } - public byte[] rootcert(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("core", "other", "rootcert", map); + public byte[] rootcert() throws ClientApiException { + return api.callApiOther("core", "other", "rootcert", null); } - public byte[] setproxy(String apikey, String proxy) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] setproxy(String proxy) throws ClientApiException { + Map map = new HashMap<>(); map.put("proxy", proxy); return api.callApiOther("core", "other", "setproxy", map); } @@ -600,36 +441,22 @@ public byte[] setproxy(String apikey, String proxy) throws ClientApiException { /** * Generates a report in XML format */ - public byte[] xmlreport(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("core", "other", "xmlreport", map); + public byte[] xmlreport() throws ClientApiException { + return api.callApiOther("core", "other", "xmlreport", null); } /** * Generates a report in HTML format */ - public byte[] htmlreport(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("core", "other", "htmlreport", map); + public byte[] htmlreport() throws ClientApiException { + return api.callApiOther("core", "other", "htmlreport", null); } /** * Gets the message with the given ID in HAR format */ - public byte[] messageHar(String apikey, String id) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] messageHar(String id) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); return api.callApiOther("core", "other", "messageHar", map); } @@ -637,12 +464,8 @@ public byte[] messageHar(String apikey, String id) throws ClientApiException { /** * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and paginated with 'start' position and 'count' of messages */ - public byte[] messagesHar(String apikey, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] messagesHar(String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } @@ -658,12 +481,8 @@ public byte[] messagesHar(String apikey, String baseurl, String start, String co /** * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, the request sent and response received and followed redirections, if any. */ - public byte[] sendHarRequest(String apikey, String request, String followredirects) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); map.put("request", request); if (followredirects != null) { map.put("followRedirects", followredirects); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java index 7e404fd..e359a20 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class ForcedUser { +@SuppressWarnings("javadoc") +public class ForcedUser extends org.zaproxy.clientapi.gen.deprecated.ForcedUserDeprecated { - private ClientApi api = null; + private final ClientApi api; public ForcedUser(ClientApi api) { + super(api); this.api = api; } @@ -42,16 +44,14 @@ public ForcedUser(ClientApi api) { * Returns 'true' if 'forced user' mode is enabled, 'false' otherwise */ public ApiResponse isForcedUserModeEnabled() throws ClientApiException { - Map map = null; - return api.callApi("forcedUser", "view", "isForcedUserModeEnabled", map); + return api.callApi("forcedUser", "view", "isForcedUserModeEnabled", null); } /** * Gets the user (ID) set as 'forced user' for the given context (ID) */ public ApiResponse getForcedUser(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("forcedUser", "view", "getForcedUser", map); } @@ -59,12 +59,8 @@ public ApiResponse getForcedUser(String contextid) throws ClientApiException { /** * Sets the user (ID) that should be used in 'forced user' mode for the given context (ID) */ - public ApiResponse setForcedUser(String apikey, String contextid, String userid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setForcedUser(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); return api.callApi("forcedUser", "action", "setForcedUser", map); @@ -73,12 +69,8 @@ public ApiResponse setForcedUser(String apikey, String contextid, String userid) /** * Sets if 'forced user' mode should be enabled or not */ - public ApiResponse setForcedUserModeEnabled(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setForcedUserModeEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("boolean", Boolean.toString(bool)); return api.callApi("forcedUser", "action", "setForcedUserModeEnabled", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index fb67288..07a0379 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class HttpSessions { +@SuppressWarnings("javadoc") +public class HttpSessions extends org.zaproxy.clientapi.gen.deprecated.HttpSessionsDeprecated { - private ClientApi api = null; + private final ClientApi api; public HttpSessions(ClientApi api) { + super(api); this.api = api; } @@ -42,8 +44,7 @@ public HttpSessions(ClientApi api) { * Gets the sessions of the given site. Optionally returning just the session with the given name. */ public ApiResponse sessions(String site, String session) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("site", site); if (session != null) { map.put("session", session); @@ -55,8 +56,7 @@ public ApiResponse sessions(String site, String session) throws ClientApiExcepti * Gets the name of the active session for the given site. */ public ApiResponse activeSession(String site) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("site", site); return api.callApi("httpSessions", "view", "activeSession", map); } @@ -65,8 +65,7 @@ public ApiResponse activeSession(String site) throws ClientApiException { * Gets the names of the session tokens for the given site. */ public ApiResponse sessionTokens(String site) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("site", site); return api.callApi("httpSessions", "view", "sessionTokens", map); } @@ -74,12 +73,8 @@ public ApiResponse sessionTokens(String site) throws ClientApiException { /** * Creates an empty session for the given site. Optionally with the given name. */ - public ApiResponse createEmptySession(String apikey, String site, String session) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse createEmptySession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); if (session != null) { map.put("session", session); @@ -90,12 +85,8 @@ public ApiResponse createEmptySession(String apikey, String site, String session /** * Removes the session from the given site. */ - public ApiResponse removeSession(String apikey, String site, String session) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeSession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("session", session); return api.callApi("httpSessions", "action", "removeSession", map); @@ -104,12 +95,8 @@ public ApiResponse removeSession(String apikey, String site, String session) thr /** * Sets the given session as active for the given site. */ - public ApiResponse setActiveSession(String apikey, String site, String session) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setActiveSession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("session", session); return api.callApi("httpSessions", "action", "setActiveSession", map); @@ -118,12 +105,8 @@ public ApiResponse setActiveSession(String apikey, String site, String session) /** * Unsets the active session of the given site. */ - public ApiResponse unsetActiveSession(String apikey, String site) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse unsetActiveSession(String site) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); return api.callApi("httpSessions", "action", "unsetActiveSession", map); } @@ -131,12 +114,8 @@ public ApiResponse unsetActiveSession(String apikey, String site) throws ClientA /** * Adds the session token to the given site. */ - public ApiResponse addSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse addSessionToken(String site, String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("sessionToken", sessiontoken); return api.callApi("httpSessions", "action", "addSessionToken", map); @@ -145,12 +124,8 @@ public ApiResponse addSessionToken(String apikey, String site, String sessiontok /** * Removes the session token from the given site. */ - public ApiResponse removeSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeSessionToken(String site, String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("sessionToken", sessiontoken); return api.callApi("httpSessions", "action", "removeSessionToken", map); @@ -159,12 +134,8 @@ public ApiResponse removeSessionToken(String apikey, String site, String session /** * Sets the value of the session token of the given session for the given site. */ - public ApiResponse setSessionTokenValue(String apikey, String site, String session, String sessiontoken, String tokenvalue) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setSessionTokenValue(String site, String session, String sessiontoken, String tokenvalue) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("session", session); map.put("sessionToken", sessiontoken); @@ -175,12 +146,8 @@ public ApiResponse setSessionTokenValue(String apikey, String site, String sessi /** * Renames the session of the given site. */ - public ApiResponse renameSession(String apikey, String site, String oldsessionname, String newsessionname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse renameSession(String site, String oldsessionname, String newsessionname) throws ClientApiException { + Map map = new HashMap<>(); map.put("site", site); map.put("oldSessionName", oldsessionname); map.put("newSessionName", newsessionname); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java index ee60571..b8a8f5c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class ImportLogFiles { +@SuppressWarnings("javadoc") +public class ImportLogFiles extends org.zaproxy.clientapi.gen.deprecated.ImportLogFilesDeprecated { - private ClientApi api = null; + private final ClientApi api; public ImportLogFiles(ClientApi api) { + super(api); this.api = api; } @@ -42,42 +44,35 @@ public ImportLogFiles(ClientApi api) { * This component is optional and therefore the API will only work if it is installed */ public ApiResponse ImportZAPLogFromFile(String filepath) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("FilePath", filepath); - return api.callApi("importLogFiles", "view", "ImportZAPLogFromFile", map); + return api.callApi("importLogFiles", "action", "ImportZAPLogFromFile", map); } /** * This component is optional and therefore the API will only work if it is installed */ public ApiResponse ImportModSecurityLogFromFile(String filepath) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("FilePath", filepath); - return api.callApi("importLogFiles", "view", "ImportModSecurityLogFromFile", map); + return api.callApi("importLogFiles", "action", "ImportModSecurityLogFromFile", map); } /** * This component is optional and therefore the API will only work if it is installed */ public ApiResponse ImportZAPHttpRequestResponsePair(String httprequest, String httpresponse) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("HTTPRequest", httprequest); map.put("HTTPResponse", httpresponse); - return api.callApi("importLogFiles", "view", "ImportZAPHttpRequestResponsePair", map); + return api.callApi("importLogFiles", "action", "ImportZAPHttpRequestResponsePair", map); } /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse PostModSecurityAuditEvent(String auditeventstring) throws ClientApiException { + Map map = new HashMap<>(); if (auditeventstring != null) { map.put("AuditEventString", auditeventstring); } @@ -87,12 +82,8 @@ public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstr /** * This component is optional and therefore the API will only work if it is installed */ - public byte[] OtherPostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] OtherPostModSecurityAuditEvent(String auditeventstring) throws ClientApiException { + Map map = new HashMap<>(); map.put("AuditEventString", auditeventstring); return api.callApiOther("importLogFiles", "other", "OtherPostModSecurityAuditEvent", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java index 3f3a7dc..1899002 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java @@ -30,9 +30,10 @@ /** * This file was automatically generated. */ +@SuppressWarnings("javadoc") public class Params { - private ClientApi api = null; + private final ClientApi api; public Params(ClientApi api) { this.api = api; @@ -42,8 +43,7 @@ public Params(ClientApi api) { * Shows the parameters for the specified site, or for all sites if the site is not specified */ public ApiResponse params(String site) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (site != null) { map.put("site", site); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java index 8afe4d3..cc40af1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java @@ -30,23 +30,21 @@ /** * This file was automatically generated. */ -public class Pnh { +@SuppressWarnings("javadoc") +public class Pnh extends org.zaproxy.clientapi.gen.deprecated.PnhDeprecated { - private ClientApi api = null; + private final ClientApi api; public Pnh(ClientApi api) { + super(api); this.api = api; } /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse monitor(String apikey, String id, String message) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse monitor(String id, String message) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("message", message); return api.callApi("pnh", "action", "monitor", map); @@ -55,12 +53,8 @@ public ApiResponse monitor(String apikey, String id, String message) throws Clie /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse oracle(String apikey, String id) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse oracle(String id) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); return api.callApi("pnh", "action", "oracle", map); } @@ -68,12 +62,8 @@ public ApiResponse oracle(String apikey, String id) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse startMonitoring(String apikey, String url) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse startMonitoring(String url) throws ClientApiException { + Map map = new HashMap<>(); map.put("url", url); return api.callApi("pnh", "action", "startMonitoring", map); } @@ -81,12 +71,8 @@ public ApiResponse startMonitoring(String apikey, String url) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse stopMonitoring(String id) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); return api.callApi("pnh", "action", "stopMonitoring", map); } @@ -94,49 +80,29 @@ public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed */ - public byte[] pnh(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("pnh", "other", "pnh", map); + public byte[] pnh() throws ClientApiException { + return api.callApiOther("pnh", "other", "pnh", null); } /** * This component is optional and therefore the API will only work if it is installed */ - public byte[] manifest(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("pnh", "other", "manifest", map); + public byte[] manifest() throws ClientApiException { + return api.callApiOther("pnh", "other", "manifest", null); } /** * This component is optional and therefore the API will only work if it is installed */ - public byte[] service(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("pnh", "other", "service", map); + public byte[] service() throws ClientApiException { + return api.callApiOther("pnh", "other", "service", null); } /** * This component is optional and therefore the API will only work if it is installed */ - public byte[] fx_pnhxpi(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApiOther("pnh", "other", "fx_pnh.xpi", map); + public byte[] fx_pnhxpi() throws ClientApiException { + return api.callApiOther("pnh", "other", "fx_pnh.xpi", null); } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index b1f1ad9..09f76b3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Pscan { +@SuppressWarnings("javadoc") +public class Pscan extends org.zaproxy.clientapi.gen.deprecated.PscanDeprecated { - private ClientApi api = null; + private final ClientApi api; public Pscan(ClientApi api) { + super(api); this.api = api; } @@ -42,27 +44,21 @@ public Pscan(ClientApi api) { * The number of records the passive scanner still has to scan */ public ApiResponse recordsToScan() throws ClientApiException { - Map map = null; - return api.callApi("pscan", "view", "recordsToScan", map); + return api.callApi("pscan", "view", "recordsToScan", null); } /** * Lists all passive scanners with its ID, name, enabled state and alert threshold. */ public ApiResponse scanners() throws ClientApiException { - Map map = null; - return api.callApi("pscan", "view", "scanners", map); + return api.callApi("pscan", "view", "scanners", null); } /** * Sets whether or not the passive scanning is enabled */ - public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setEnabled(String enabled) throws ClientApiException { + Map map = new HashMap<>(); map.put("enabled", enabled); return api.callApi("pscan", "action", "setEnabled", map); } @@ -70,36 +66,22 @@ public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiExc /** * Enables all passive scanners */ - public ApiResponse enableAllScanners(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("pscan", "action", "enableAllScanners", map); + public ApiResponse enableAllScanners() throws ClientApiException { + return api.callApi("pscan", "action", "enableAllScanners", null); } /** * Disables all passive scanners */ - public ApiResponse disableAllScanners(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("pscan", "action", "disableAllScanners", map); + public ApiResponse disableAllScanners() throws ClientApiException { + return api.callApi("pscan", "action", "disableAllScanners", null); } /** * Enables all passive scanners with the given IDs (comma separated list of IDs) */ - public ApiResponse enableScanners(String apikey, String ids) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse enableScanners(String ids) throws ClientApiException { + Map map = new HashMap<>(); map.put("ids", ids); return api.callApi("pscan", "action", "enableScanners", map); } @@ -107,12 +89,8 @@ public ApiResponse enableScanners(String apikey, String ids) throws ClientApiExc /** * Disables all passive scanners with the given IDs (comma separated list of IDs) */ - public ApiResponse disableScanners(String apikey, String ids) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse disableScanners(String ids) throws ClientApiException { + Map map = new HashMap<>(); map.put("ids", ids); return api.callApi("pscan", "action", "disableScanners", map); } @@ -120,12 +98,8 @@ public ApiResponse disableScanners(String apikey, String ids) throws ClientApiEx /** * Sets the alert threshold of the passive scanner with the given ID, accepted values for alert threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH */ - public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) throws ClientApiException { + Map map = new HashMap<>(); map.put("id", id); map.put("alertThreshold", alertthreshold); return api.callApi("pscan", "action", "setScannerAlertThreshold", map); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java index 0f74cf2..c7d6d7c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Reveal { +@SuppressWarnings("javadoc") +public class Reveal extends org.zaproxy.clientapi.gen.deprecated.RevealDeprecated { - private ClientApi api = null; + private final ClientApi api; public Reveal(ClientApi api) { + super(api); this.api = api; } @@ -42,19 +44,14 @@ public Reveal(ClientApi api) { * This component is optional and therefore the API will only work if it is installed */ public ApiResponse reveal() throws ClientApiException { - Map map = null; - return api.callApi("reveal", "view", "reveal", map); + return api.callApi("reveal", "view", "reveal", null); } /** * This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setReveal(String apikey, String reveal) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setReveal(String reveal) throws ClientApiException { + Map map = new HashMap<>(); map.put("reveal", reveal); return api.callApi("reveal", "action", "setReveal", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 66b6839..1abeb0a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Script { +@SuppressWarnings("javadoc") +public class Script extends org.zaproxy.clientapi.gen.deprecated.ScriptDeprecated { - private ClientApi api = null; + private final ClientApi api; public Script(ClientApi api) { + super(api); this.api = api; } @@ -42,27 +44,21 @@ public Script(ClientApi api) { * Lists the script engines available */ public ApiResponse listEngines() throws ClientApiException { - Map map = null; - return api.callApi("script", "view", "listEngines", map); + return api.callApi("script", "view", "listEngines", null); } /** * Lists the scripts available, with its engine, name, description, type and error state. */ public ApiResponse listScripts() throws ClientApiException { - Map map = null; - return api.callApi("script", "view", "listScripts", map); + return api.callApi("script", "view", "listScripts", null); } /** * Enables the script with the given name */ - public ApiResponse enable(String apikey, String scriptname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse enable(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "enable", map); } @@ -70,12 +66,8 @@ public ApiResponse enable(String apikey, String scriptname) throws ClientApiExce /** * Disables the script with the given name */ - public ApiResponse disable(String apikey, String scriptname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse disable(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "disable", map); } @@ -83,12 +75,8 @@ public ApiResponse disable(String apikey, String scriptname) throws ClientApiExc /** * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description */ - public ApiResponse load(String apikey, String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription) throws ClientApiException { + Map map = new HashMap<>(); map.put("scriptName", scriptname); map.put("scriptType", scripttype); map.put("scriptEngine", scriptengine); @@ -102,12 +90,8 @@ public ApiResponse load(String apikey, String scriptname, String scripttype, Str /** * Removes the script with the given name */ - public ApiResponse remove(String apikey, String scriptname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse remove(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "remove", map); } @@ -115,12 +99,8 @@ public ApiResponse remove(String apikey, String scriptname) throws ClientApiExce /** * Runs the stand alone script with the give name */ - public ApiResponse runStandAloneScript(String apikey, String scriptname) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse runStandAloneScript(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "runStandAloneScript", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index a27bb40..7b19a5c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -30,17 +30,18 @@ /** * This file was automatically generated. */ -public class Search { +@SuppressWarnings("javadoc") +public class Search extends org.zaproxy.clientapi.gen.deprecated.SearchDeprecated { - private ClientApi api = null; + private final ClientApi api; public Search(ClientApi api) { + super(api); this.api = api; } public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -55,8 +56,7 @@ public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, St } public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -71,8 +71,7 @@ public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start } public ApiResponse urlsByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -87,8 +86,7 @@ public ApiResponse urlsByResponseRegex(String regex, String baseurl, String star } public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -103,8 +101,7 @@ public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, } public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -119,8 +116,7 @@ public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start } public ApiResponse messagesByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -135,8 +131,7 @@ public ApiResponse messagesByRequestRegex(String regex, String baseurl, String s } public ApiResponse messagesByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -151,8 +146,7 @@ public ApiResponse messagesByResponseRegex(String regex, String baseurl, String } public ApiResponse messagesByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -166,12 +160,8 @@ public ApiResponse messagesByHeaderRegex(String regex, String baseurl, String st return api.callApi("search", "view", "messagesByHeaderRegex", map); } - public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] harByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -185,12 +175,8 @@ public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String return api.callApiOther("search", "other", "harByUrlRegex", map); } - public byte[] harByRequestRegex(String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] harByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -204,12 +190,8 @@ public byte[] harByRequestRegex(String apikey, String regex, String baseurl, Str return api.callApiOther("search", "other", "harByRequestRegex", map); } - public byte[] harByResponseRegex(String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] harByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); @@ -223,12 +205,8 @@ public byte[] harByResponseRegex(String apikey, String regex, String baseurl, St return api.callApiOther("search", "other", "harByResponseRegex", map); } - public byte[] harByHeaderRegex(String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public byte[] harByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); if (baseurl != null) { map.put("baseurl", baseurl); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index dcce0e9..7f15fe5 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Selenium { +@SuppressWarnings("javadoc") +public class Selenium extends org.zaproxy.clientapi.gen.deprecated.SeleniumDeprecated { private final ClientApi api; public Selenium(ClientApi api) { + super(api); this.api = api; } @@ -88,11 +90,8 @@ public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionChromeDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionChromeDriverPath(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("selenium", "action", "setOptionChromeDriverPath", map); } @@ -102,11 +101,8 @@ public ApiResponse setOptionChromeDriverPath(String apikey, String string) throw *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionFirefoxBinaryPath(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("selenium", "action", "setOptionFirefoxBinaryPath", map); } @@ -116,11 +112,8 @@ public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) thro *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionFirefoxDriverPath(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); } @@ -130,11 +123,8 @@ public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) thro *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionIeDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionIeDriverPath(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("selenium", "action", "setOptionIeDriverPath", map); } @@ -144,11 +134,8 @@ public ApiResponse setOptionIeDriverPath(String apikey, String string) throws Cl *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionPhantomJsBinaryPath(String string) throws ClientApiException { Map map = new HashMap<>(); - if (apikey != null) { - map.put("apikey", apikey); - } map.put("String", string); return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java index e83fc55..8396507 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java @@ -30,39 +30,34 @@ /** * This file was automatically generated. */ -public class SessionManagement { +@SuppressWarnings("javadoc") +public class SessionManagement extends org.zaproxy.clientapi.gen.deprecated.SessionManagementDeprecated { - private ClientApi api = null; + private final ClientApi api; public SessionManagement(ClientApi api) { + super(api); this.api = api; } public ApiResponse getSupportedSessionManagementMethods() throws ClientApiException { - Map map = null; - return api.callApi("sessionManagement", "view", "getSupportedSessionManagementMethods", map); + return api.callApi("sessionManagement", "view", "getSupportedSessionManagementMethods", null); } public ApiResponse getSessionManagementMethodConfigParams(String methodname) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("methodName", methodname); return api.callApi("sessionManagement", "view", "getSessionManagementMethodConfigParams", map); } public ApiResponse getSessionManagementMethod(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("sessionManagement", "view", "getSessionManagementMethod", map); } - public ApiResponse setSessionManagementMethod(String apikey, String contextid, String methodname, String methodconfigparams) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setSessionManagementMethod(String contextid, String methodname, String methodconfigparams) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("methodName", methodname); if (methodconfigparams != null) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 92b4414..691256a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -30,17 +30,18 @@ /** * This file was automatically generated. */ -public class Spider { +@SuppressWarnings("javadoc") +public class Spider extends org.zaproxy.clientapi.gen.deprecated.SpiderDeprecated { - private ClientApi api = null; + private final ClientApi api; public Spider(ClientApi api) { + super(api); this.api = api; } public ApiResponse status(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanid != null) { map.put("scanId", scanid); } @@ -48,8 +49,7 @@ public ApiResponse status(String scanid) throws ClientApiException { } public ApiResponse results(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (scanid != null) { map.put("scanId", scanid); } @@ -57,144 +57,115 @@ public ApiResponse results(String scanid) throws ClientApiException { } public ApiResponse fullResults(String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "view", "fullResults", map); } public ApiResponse scans() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "scans", map); + return api.callApi("spider", "view", "scans", null); } public ApiResponse excludedFromScan() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "excludedFromScan", map); + return api.callApi("spider", "view", "excludedFromScan", null); } public ApiResponse optionDomainsAlwaysInScope() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionDomainsAlwaysInScope", map); + return api.callApi("spider", "view", "optionDomainsAlwaysInScope", null); } public ApiResponse optionDomainsAlwaysInScopeEnabled() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", map); + return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", null); } public ApiResponse optionHandleParameters() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionHandleParameters", map); + return api.callApi("spider", "view", "optionHandleParameters", null); } public ApiResponse optionMaxDepth() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionMaxDepth", map); + return api.callApi("spider", "view", "optionMaxDepth", null); } public ApiResponse optionMaxDuration() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionMaxDuration", map); + return api.callApi("spider", "view", "optionMaxDuration", null); } public ApiResponse optionMaxScansInUI() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionMaxScansInUI", map); + return api.callApi("spider", "view", "optionMaxScansInUI", null); } public ApiResponse optionRequestWaitTime() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionRequestWaitTime", map); + return api.callApi("spider", "view", "optionRequestWaitTime", null); } public ApiResponse optionScope() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionScope", map); + return api.callApi("spider", "view", "optionScope", null); } public ApiResponse optionScopeText() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionScopeText", map); + return api.callApi("spider", "view", "optionScopeText", null); } public ApiResponse optionSkipURLString() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionSkipURLString", map); + return api.callApi("spider", "view", "optionSkipURLString", null); } public ApiResponse optionThreadCount() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionThreadCount", map); + return api.callApi("spider", "view", "optionThreadCount", null); } public ApiResponse optionUserAgent() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionUserAgent", map); + return api.callApi("spider", "view", "optionUserAgent", null); } public ApiResponse optionHandleODataParametersVisited() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionHandleODataParametersVisited", map); + return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); } public ApiResponse optionParseComments() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionParseComments", map); + return api.callApi("spider", "view", "optionParseComments", null); } public ApiResponse optionParseGit() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionParseGit", map); + return api.callApi("spider", "view", "optionParseGit", null); } public ApiResponse optionParseRobotsTxt() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionParseRobotsTxt", map); + return api.callApi("spider", "view", "optionParseRobotsTxt", null); } public ApiResponse optionParseSVNEntries() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionParseSVNEntries", map); + return api.callApi("spider", "view", "optionParseSVNEntries", null); } public ApiResponse optionParseSitemapXml() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionParseSitemapXml", map); + return api.callApi("spider", "view", "optionParseSitemapXml", null); } public ApiResponse optionPostForm() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionPostForm", map); + return api.callApi("spider", "view", "optionPostForm", null); } public ApiResponse optionProcessForm() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionProcessForm", map); + return api.callApi("spider", "view", "optionProcessForm", null); } /** * Sets whether or not the 'Referer' header should be sent while spidering */ public ApiResponse optionSendRefererHeader() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionSendRefererHeader", map); + return api.callApi("spider", "view", "optionSendRefererHeader", null); } public ApiResponse optionShowAdvancedDialog() throws ClientApiException { - Map map = null; - return api.callApi("spider", "view", "optionShowAdvancedDialog", map); + return api.callApi("spider", "view", "optionShowAdvancedDialog", null); } /** * Runs the spider against the given URL (or context). Optionally, the 'maxChildren' parameter can be set to limit the number of children scanned, the 'recurse' parameter can be used to prevent the spider from seeding recursively, the parameter 'contextName' can be used to constrain the scan to a Context and the parameter 'subtreeOnly' allows to restrict the spider under a site's subtree (using the specified 'url'). */ - public ApiResponse scan(String apikey, String url, String maxchildren, String recurse, String contextname, String subtreeonly) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse scan(String url, String maxchildren, String recurse, String contextname, String subtreeonly) throws ClientApiException { + Map map = new HashMap<>(); if (url != null) { map.put("url", url); } @@ -216,12 +187,8 @@ public ApiResponse scan(String apikey, String url, String maxchildren, String re /** * Runs the spider from the perspective of a User, obtained using the given Context ID and User ID. See 'scan' action for more details. */ - public ApiResponse scanAsUser(String apikey, String contextid, String userid, String url, String maxchildren, String recurse, String subtreeonly) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse scanAsUser(String contextid, String userid, String url, String maxchildren, String recurse, String subtreeonly) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); if (url != null) { @@ -239,289 +206,168 @@ public ApiResponse scanAsUser(String apikey, String contextid, String userid, St return api.callApi("spider", "action", "scanAsUser", map); } - public ApiResponse pause(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse pause(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "pause", map); } - public ApiResponse resume(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse resume(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "resume", map); } - public ApiResponse stop(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse stop(String scanid) throws ClientApiException { + Map map = new HashMap<>(); if (scanid != null) { map.put("scanId", scanid); } return api.callApi("spider", "action", "stop", map); } - public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeScan(String scanid) throws ClientApiException { + Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "removeScan", map); } - public ApiResponse pauseAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("spider", "action", "pauseAllScans", map); + public ApiResponse pauseAllScans() throws ClientApiException { + return api.callApi("spider", "action", "pauseAllScans", null); } - public ApiResponse resumeAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("spider", "action", "resumeAllScans", map); + public ApiResponse resumeAllScans() throws ClientApiException { + return api.callApi("spider", "action", "resumeAllScans", null); } - public ApiResponse stopAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("spider", "action", "stopAllScans", map); + public ApiResponse stopAllScans() throws ClientApiException { + return api.callApi("spider", "action", "stopAllScans", null); } - public ApiResponse removeAllScans(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("spider", "action", "removeAllScans", map); + public ApiResponse removeAllScans() throws ClientApiException { + return api.callApi("spider", "action", "removeAllScans", null); } - public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } - return api.callApi("spider", "action", "clearExcludedFromScan", map); + public ApiResponse clearExcludedFromScan() throws ClientApiException { + return api.callApi("spider", "action", "clearExcludedFromScan", null); } - public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse excludeFromScan(String regex) throws ClientApiException { + Map map = new HashMap<>(); map.put("regex", regex); return api.callApi("spider", "action", "excludeFromScan", map); } - public ApiResponse setOptionHandleParameters(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionHandleParameters(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionHandleParameters", map); } - public ApiResponse setOptionScopeString(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionScopeString(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionScopeString", map); } - public ApiResponse setOptionSkipURLString(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionSkipURLString(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionSkipURLString", map); } - public ApiResponse setOptionUserAgent(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionUserAgent(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionUserAgent", map); } - public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionHandleODataParametersVisited(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); } - public ApiResponse setOptionMaxDepth(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxDepth", map); } - public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxDuration", map); } - public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxScansInUI", map); } - public ApiResponse setOptionParseComments(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionParseComments(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseComments", map); } - public ApiResponse setOptionParseGit(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionParseGit(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseGit", map); } - public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionParseRobotsTxt(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseRobotsTxt", map); } - public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionParseSVNEntries(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseSVNEntries", map); } - public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionParseSitemapXml(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseSitemapXml", map); } - public ApiResponse setOptionPostForm(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionPostForm(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionPostForm", map); } - public ApiResponse setOptionProcessForm(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionProcessForm(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionProcessForm", map); } - public ApiResponse setOptionRequestWaitTime(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionRequestWaitTime", map); } - public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionSendRefererHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionSendRefererHeader", map); } - public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionShowAdvancedDialog", map); } - public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionThreadCount(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionThreadCount", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java index 7bcff0c..e661155 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java @@ -30,11 +30,13 @@ /** * This file was automatically generated. */ -public class Stats { +@SuppressWarnings("javadoc") +public class Stats extends org.zaproxy.clientapi.gen.deprecated.StatsDeprecated { - private ClientApi api = null; + private final ClientApi api; public Stats(ClientApi api) { + super(api); this.api = api; } @@ -42,8 +44,7 @@ public Stats(ClientApi api) { * Statistics */ public ApiResponse stats(String keyprefix) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (keyprefix != null) { map.put("keyPrefix", keyprefix); } @@ -54,8 +55,7 @@ public ApiResponse stats(String keyprefix) throws ClientApiException { * Gets all of the site based statistics, optionally filtered by a key prefix */ public ApiResponse allSitesStats(String keyprefix) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (keyprefix != null) { map.put("keyPrefix", keyprefix); } @@ -66,8 +66,7 @@ public ApiResponse allSitesStats(String keyprefix) throws ClientApiException { * Gets all of the global statistics, optionally filtered by a key prefix */ public ApiResponse siteStats(String site, String keyprefix) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("site", site); if (keyprefix != null) { map.put("keyPrefix", keyprefix); @@ -79,51 +78,42 @@ public ApiResponse siteStats(String site, String keyprefix) throws ClientApiExce * Gets the Statsd service hostname */ public ApiResponse optionStatsdHost() throws ClientApiException { - Map map = null; - return api.callApi("stats", "view", "optionStatsdHost", map); + return api.callApi("stats", "view", "optionStatsdHost", null); } /** * Gets the Statsd service port */ public ApiResponse optionStatsdPort() throws ClientApiException { - Map map = null; - return api.callApi("stats", "view", "optionStatsdPort", map); + return api.callApi("stats", "view", "optionStatsdPort", null); } /** * Gets the prefix to be applied to all stats sent to the configured Statsd service */ public ApiResponse optionStatsdPrefix() throws ClientApiException { - Map map = null; - return api.callApi("stats", "view", "optionStatsdPrefix", map); + return api.callApi("stats", "view", "optionStatsdPrefix", null); } /** * Returns 'true' if in memory statistics are enabled, otherwise returns 'false' */ public ApiResponse optionInMemoryEnabled() throws ClientApiException { - Map map = null; - return api.callApi("stats", "view", "optionInMemoryEnabled", map); + return api.callApi("stats", "view", "optionInMemoryEnabled", null); } /** * Returns 'true' if a Statsd server has been correctly configured, otherwise returns 'false' */ public ApiResponse optionStatsdEnabled() throws ClientApiException { - Map map = null; - return api.callApi("stats", "view", "optionStatsdEnabled", map); + return api.callApi("stats", "view", "optionStatsdEnabled", null); } /** * Clears all of the statistics */ - public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse clearStats(String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); if (keyprefix != null) { map.put("keyPrefix", keyprefix); } @@ -133,12 +123,8 @@ public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiE /** * Sets the Statsd service hostname, supply an empty string to stop using a Statsd service */ - public ApiResponse setOptionStatsdHost(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionStatsdHost(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("stats", "action", "setOptionStatsdHost", map); } @@ -146,12 +132,8 @@ public ApiResponse setOptionStatsdHost(String apikey, String string) throws Clie /** * Sets the prefix to be applied to all stats sent to the configured Statsd service */ - public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionStatsdPrefix(String string) throws ClientApiException { + Map map = new HashMap<>(); map.put("String", string); return api.callApi("stats", "action", "setOptionStatsdPrefix", map); } @@ -159,12 +141,8 @@ public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws Cl /** * Sets whether in memory statistics are enabled */ - public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionInMemoryEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("stats", "action", "setOptionInMemoryEnabled", map); } @@ -172,12 +150,8 @@ public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws /** * Sets the Statsd service port */ - public ApiResponse setOptionStatsdPort(String apikey, int i) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setOptionStatsdPort(int i) throws ClientApiException { + Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("stats", "action", "setOptionStatsdPort", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 22500e8..4b3e2d3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -30,17 +30,18 @@ /** * This file was automatically generated. */ -public class Users { +@SuppressWarnings("javadoc") +public class Users extends org.zaproxy.clientapi.gen.deprecated.UsersDeprecated { - private ClientApi api = null; + private final ClientApi api; public Users(ClientApi api) { + super(api); this.api = api; } public ApiResponse usersList(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (contextid != null) { map.put("contextId", contextid); } @@ -48,8 +49,7 @@ public ApiResponse usersList(String contextid) throws ClientApiException { } public ApiResponse getUserById(String contextid, String userid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); if (contextid != null) { map.put("contextId", contextid); } @@ -60,72 +60,50 @@ public ApiResponse getUserById(String contextid, String userid) throws ClientApi } public ApiResponse getAuthenticationCredentialsConfigParams(String contextid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("users", "view", "getAuthenticationCredentialsConfigParams", map); } public ApiResponse getAuthenticationCredentials(String contextid, String userid) throws ClientApiException { - Map map = null; - map = new HashMap(); + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); return api.callApi("users", "view", "getAuthenticationCredentials", map); } - public ApiResponse newUser(String apikey, String contextid, String name) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse newUser(String contextid, String name) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("name", name); return api.callApi("users", "action", "newUser", map); } - public ApiResponse removeUser(String apikey, String contextid, String userid) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse removeUser(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); return api.callApi("users", "action", "removeUser", map); } - public ApiResponse setUserEnabled(String apikey, String contextid, String userid, String enabled) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setUserEnabled(String contextid, String userid, String enabled) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); map.put("enabled", enabled); return api.callApi("users", "action", "setUserEnabled", map); } - public ApiResponse setUserName(String apikey, String contextid, String userid, String name) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setUserName(String contextid, String userid, String name) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); map.put("name", name); return api.callApi("users", "action", "setUserName", map); } - public ApiResponse setAuthenticationCredentials(String apikey, String contextid, String userid, String authcredentialsconfigparams) throws ClientApiException { - Map map = null; - map = new HashMap(); - if (apikey != null) { - map.put("apikey", apikey); - } + public ApiResponse setAuthenticationCredentials(String contextid, String userid, String authcredentialsconfigparams) throws ClientApiException { + Map map = new HashMap<>(); map.put("contextId", contextid); map.put("userId", userid); if (authcredentialsconfigparams != null) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java new file mode 100644 index 0000000..0eb2ade --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java @@ -0,0 +1,83 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AcsrfDeprecated { + + private final ClientApi api; + + public AcsrfDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse addOptionToken(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("acsrf", "action", "addOptionToken", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeOptionToken(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("acsrf", "action", "removeOptionToken", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] genForm(String apikey, String hrefid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("hrefId", hrefid); + return api.callApiOther("acsrf", "other", "genForm", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java new file mode 100644 index 0000000..20e01a5 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java @@ -0,0 +1,236 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AjaxSpiderDeprecated { + + private final ClientApi api; + + public AjaxSpiderDeprecated(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed. + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse scan(String apikey, String url, String inscope) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (url != null) { + map.put("url", url); + } + if (inscope != null) { + map.put("inScope", inscope); + } + return api.callApi("ajaxSpider", "action", "scan", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stop(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ajaxSpider", "action", "stop", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionBrowserId(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("ajaxSpider", "action", "setOptionBrowserId", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionClickDefaultElems", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionEventWait", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlDepth", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlStates", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxDuration", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionNumberOfBrowsers", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionRandomInputs", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionReloadWait(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionReloadWait", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java new file mode 100644 index 0000000..ab097fc --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java @@ -0,0 +1,687 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AscanDeprecated { + + private final ClientApi api; + + public AscanDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse scan( + String apikey, + String url, + String recurse, + String inscopeonly, + String scanpolicyname, + String method, + String postdata) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("url", url); + if (recurse != null) { + map.put("recurse", recurse); + } + if (inscopeonly != null) { + map.put("inScopeOnly", inscopeonly); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + return api.callApi("ascan", "action", "scan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse scanAsUser( + String apikey, + String url, + String contextid, + String userid, + String recurse, + String scanpolicyname, + String method, + String postdata) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("url", url); + map.put("contextId", contextid); + map.put("userId", userid); + if (recurse != null) { + map.put("recurse", recurse); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + return api.callApi("ascan", "action", "scanAsUser", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse pause(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("ascan", "action", "pause", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse resume(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("ascan", "action", "resume", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stop(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("ascan", "action", "stop", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("ascan", "action", "removeScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse pauseAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ascan", "action", "pauseAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse resumeAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ascan", "action", "resumeAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stopAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ascan", "action", "stopAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ascan", "action", "removeAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("ascan", "action", "clearExcludedFromScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + return api.callApi("ascan", "action", "excludeFromScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse enableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "enableAllScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse disableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "disableAllScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse enableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "enableScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse disableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "disableScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setEnabledPolicies", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setPolicyAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("attackStrength", attackstrength); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setPolicyAttackStrength", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setPolicyAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("alertThreshold", alertthreshold); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setPolicyAlertThreshold", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setScannerAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("attackStrength", attackstrength); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setScannerAttackStrength", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("alertThreshold", alertthreshold); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setScannerAlertThreshold", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse addScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanPolicyName", scanpolicyname); + return api.callApi("ascan", "action", "addScanPolicy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanPolicyName", scanpolicyname); + return api.callApi("ascan", "action", "removeScanPolicy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionAttackPolicy(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("ascan", "action", "setOptionAttackPolicy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionDefaultPolicy(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("ascan", "action", "setOptionDefaultPolicy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionDelayInMs(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionDelayInMs", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionHandleAntiCSRFTokens", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionHostPerScan(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionHostPerScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionInjectPluginIdInHeader", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxChartTimeInMins(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxChartTimeInMins", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxResultsToList(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxResultsToList", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxScansInUI", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionPromptInAttackMode", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionPromptToClearFinishedScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionRescanInAttackMode", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionScanHeadersAllRequests", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionShowAdvancedDialog", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionTargetParamsEnabledRPC", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionTargetParamsInjectable", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionThreadPerHost(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionThreadPerHost", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java new file mode 100644 index 0000000..9a73ddf --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java @@ -0,0 +1,95 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AuthenticationDeprecated { + + private final ClientApi api; + + public AuthenticationDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setAuthenticationMethod( + String apikey, + String contextid, + String authmethodname, + String authmethodconfigparams) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("authMethodName", authmethodname); + if (authmethodconfigparams != null) { + map.put("authMethodConfigParams", authmethodconfigparams); + } + return api.callApi("authentication", "action", "setAuthenticationMethod", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setLoggedInIndicator(String apikey, String contextid, String loggedinindicatorregex) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("loggedInIndicatorRegex", loggedinindicatorregex); + return api.callApi("authentication", "action", "setLoggedInIndicator", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setLoggedOutIndicator(String apikey, String contextid, String loggedoutindicatorregex) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("loggedOutIndicatorRegex", loggedoutindicatorregex); + return api.callApi("authentication", "action", "setLoggedOutIndicator", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java new file mode 100644 index 0000000..1f6c6cb --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java @@ -0,0 +1,73 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AuthorizationDeprecated { + + private final ClientApi api; + + public AuthorizationDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setBasicAuthorizationDetectionMethod( + String apikey, + String contextid, + String headerregex, + String bodyregex, + String statuscode, + String logicaloperator) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + if (headerregex != null) { + map.put("headerRegex", headerregex); + } + if (bodyregex != null) { + map.put("bodyRegex", bodyregex); + } + if (statuscode != null) { + map.put("statusCode", statuscode); + } + if (logicaloperator != null) { + map.put("logicalOperator", logicaloperator); + } + return api.callApi("authorization", "action", "setBasicAuthorizationDetectionMethod", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java new file mode 100644 index 0000000..4f5242b --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java @@ -0,0 +1,166 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class AutoupdateDeprecated { + + private final ClientApi api; + + public AutoupdateDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse downloadLatestRelease(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("autoupdate", "action", "downloadLatestRelease", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionCheckAddonUpdates", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionCheckOnStart", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionDownloadNewRelease", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionInstallAddonUpdates", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionInstallScannerRules", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportAlphaAddons", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportBetaAddons", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionReportReleaseAddons(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportReleaseAddons", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java new file mode 100644 index 0000000..6f8981a --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java @@ -0,0 +1,105 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class BreakDeprecated { + + private final ClientApi api; + + public BreakDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse brk(String apikey, String type, String scope, String state) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("type", type); + map.put("scope", scope); + map.put("state", state); + return api.callApi("break", "action", "break", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse addHttpBreakpoint( + String apikey, + String string, + String location, + String match, + String inverse, + String ignorecase) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("string", string); + map.put("location", location); + map.put("match", match); + map.put("inverse", inverse); + map.put("ignorecase", ignorecase); + return api.callApi("break", "action", "addHttpBreakpoint", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeHttpBreakpoint( + String apikey, + String string, + String location, + String match, + String inverse, + String ignorecase) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("string", string); + map.put("location", location); + map.put("match", match); + map.put("inverse", inverse); + map.put("ignorecase", ignorecase); + return api.callApi("break", "action", "removeHttpBreakpoint", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java new file mode 100644 index 0000000..f1f36f0 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java @@ -0,0 +1,203 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class ContextDeprecated { + + private final ClientApi api; + + public ContextDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeFromContext(String apikey, String contextname, String regex) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("regex", regex); + return api.callApi("context", "action", "excludeFromContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse includeInContext(String apikey, String contextname, String regex) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("regex", regex); + return api.callApi("context", "action", "includeInContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse newContext(String apikey, String contextname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + return api.callApi("context", "action", "newContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeContext(String apikey, String contextname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + return api.callApi("context", "action", "removeContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse exportContext(String apikey, String contextname, String contextfile) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("contextFile", contextfile); + return api.callApi("context", "action", "exportContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse importContext(String apikey, String contextfile) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextFile", contextfile); + return api.callApi("context", "action", "importContext", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse includeContextTechnologies(String apikey, String contextname, String technologynames) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("technologyNames", technologynames); + return api.callApi("context", "action", "includeContextTechnologies", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse includeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + return api.callApi("context", "action", "includeAllContextTechnologies", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeContextTechnologies(String apikey, String contextname, String technologynames) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("technologyNames", technologynames); + return api.callApi("context", "action", "excludeContextTechnologies", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + return api.callApi("context", "action", "excludeAllContextTechnologies", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setContextInScope(String apikey, String contextname, String booleaninscope) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextName", contextname); + map.put("booleanInScope", booleaninscope); + return api.callApi("context", "action", "setContextInScope", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java new file mode 100644 index 0000000..44a42f7 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -0,0 +1,566 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class CoreDeprecated { + + private final ClientApi api; + + public CoreDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse accessUrl(String apikey, String url, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("url", url); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApi("core", "action", "accessUrl", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse shutdown(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "shutdown", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse newSession(String apikey, String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (name != null) { + map.put("name", name); + } + if (overwrite != null) { + map.put("overwrite", overwrite); + } + return api.callApi("core", "action", "newSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse loadSession(String apikey, String name) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("name", name); + return api.callApi("core", "action", "loadSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse saveSession(String apikey, String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("name", name); + if (overwrite != null) { + map.put("overwrite", overwrite); + } + return api.callApi("core", "action", "saveSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse snapshotSession(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "snapshotSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse clearExcludedFromProxy(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "clearExcludedFromProxy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeFromProxy(String apikey, String regex) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + return api.callApi("core", "action", "excludeFromProxy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("dir", dir); + return api.callApi("core", "action", "setHomeDirectory", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setMode(String apikey, String mode) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("mode", mode); + return api.callApi("core", "action", "setMode", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse generateRootCA(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "generateRootCA", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse sendRequest(String apikey, String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("request", request); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApi("core", "action", "sendRequest", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse deleteAllAlerts(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "deleteAllAlerts", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse runGarbageCollection(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("core", "action", "runGarbageCollection", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse deleteSiteNode(String apikey, String url, String method, String postdata) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("url", url); + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + return api.callApi("core", "action", "deleteSiteNode", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionDefaultUserAgent(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionDefaultUserAgent", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainName(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainName", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainPassword(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainPassword", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainRealm(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainRealm", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainSkipName(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainSkipName", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainUserName(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainUserName", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionHttpStateEnabled", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainPort(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionProxyChainPort", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionProxyChainPrompt", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionTimeoutInSecs(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionTimeoutInSecs", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionUseProxyChain", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] proxypac(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("core", "other", "proxy.pac", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] rootcert(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("core", "other", "rootcert", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] setproxy(String apikey, String proxy) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("proxy", proxy); + return api.callApiOther("core", "other", "setproxy", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] xmlreport(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("core", "other", "xmlreport", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] htmlreport(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("core", "other", "htmlreport", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] messageHar(String apikey, String id) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + return api.callApiOther("core", "other", "messageHar", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] messagesHar(String apikey, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("core", "other", "messagesHar", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] sendHarRequest(String apikey, String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("request", request); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApiOther("core", "other", "sendHarRequest", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java new file mode 100644 index 0000000..f168cc7 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java @@ -0,0 +1,70 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class ForcedUserDeprecated { + + private final ClientApi api; + + public ForcedUserDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setForcedUser(String apikey, String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("forcedUser", "action", "setForcedUser", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setForcedUserModeEnabled(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("boolean", Boolean.toString(bool)); + return api.callApi("forcedUser", "action", "setForcedUserModeEnabled", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java new file mode 100644 index 0000000..c2eb6e8 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java @@ -0,0 +1,167 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class HttpSessionsDeprecated { + + private final ClientApi api; + + public HttpSessionsDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse createEmptySession(String apikey, String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + if (session != null) { + map.put("session", session); + } + return api.callApi("httpSessions", "action", "createEmptySession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeSession(String apikey, String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("session", session); + return api.callApi("httpSessions", "action", "removeSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setActiveSession(String apikey, String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("session", session); + return api.callApi("httpSessions", "action", "setActiveSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse unsetActiveSession(String apikey, String site) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + return api.callApi("httpSessions", "action", "unsetActiveSession", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse addSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("sessionToken", sessiontoken); + return api.callApi("httpSessions", "action", "addSessionToken", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("sessionToken", sessiontoken); + return api.callApi("httpSessions", "action", "removeSessionToken", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setSessionTokenValue(String apikey, String site, String session, String sessiontoken, String tokenvalue) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("session", session); + map.put("sessionToken", sessiontoken); + map.put("tokenValue", tokenvalue); + return api.callApi("httpSessions", "action", "setSessionTokenValue", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse renameSession(String apikey, String site, String oldsessionname, String newsessionname) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("site", site); + map.put("oldSessionName", oldsessionname); + map.put("newSessionName", newsessionname); + return api.callApi("httpSessions", "action", "renameSession", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java new file mode 100644 index 0000000..039b10f --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java @@ -0,0 +1,123 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class ImportLogFilesDeprecated { + + private final ClientApi api; + + public ImportLogFilesDeprecated(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse ImportZAPLogFromFile(String apikey, String filepath) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("FilePath", filepath); + return api.callApi("importLogFiles", "action", "ImportZAPLogFromFile", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse ImportModSecurityLogFromFile(String apikey, String filepath) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("FilePath", filepath); + return api.callApi("importLogFiles", "action", "ImportModSecurityLogFromFile", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse ImportZAPHttpRequestResponsePair(String apikey, String httprequest, String httpresponse) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("HTTPRequest", httprequest); + map.put("HTTPResponse", httpresponse); + return api.callApi("importLogFiles", "action", "ImportZAPHttpRequestResponsePair", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (auditeventstring != null) { + map.put("AuditEventString", auditeventstring); + } + return api.callApi("importLogFiles", "action", "PostModSecurityAuditEvent", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] OtherPostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("AuditEventString", auditeventstring); + return api.callApiOther("importLogFiles", "other", "OtherPostModSecurityAuditEvent", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java new file mode 100644 index 0000000..9cde76a --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java @@ -0,0 +1,166 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class PnhDeprecated { + + private final ClientApi api; + + public PnhDeprecated(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse monitor(String apikey, String id, String message) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("message", message); + return api.callApi("pnh", "action", "monitor", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse oracle(String apikey, String id) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + return api.callApi("pnh", "action", "oracle", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse startMonitoring(String apikey, String url) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("url", url); + return api.callApi("pnh", "action", "startMonitoring", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + return api.callApi("pnh", "action", "stopMonitoring", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] pnh(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("pnh", "other", "pnh", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] manifest(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("pnh", "other", "manifest", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] service(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("pnh", "other", "service", map); + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] fx_pnhxpi(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApiOther("pnh", "other", "fx_pnh.xpi", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java new file mode 100644 index 0000000..d69ae43 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java @@ -0,0 +1,124 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class PscanDeprecated { + + private final ClientApi api; + + public PscanDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("enabled", enabled); + return api.callApi("pscan", "action", "setEnabled", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse enableAllScanners(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("pscan", "action", "enableAllScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse disableAllScanners(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("pscan", "action", "disableAllScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse enableScanners(String apikey, String ids) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("ids", ids); + return api.callApi("pscan", "action", "enableScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse disableScanners(String apikey, String ids) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("ids", ids); + return api.callApi("pscan", "action", "disableScanners", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("id", id); + map.put("alertThreshold", alertthreshold); + return api.callApi("pscan", "action", "setScannerAlertThreshold", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java new file mode 100644 index 0000000..f425134 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java @@ -0,0 +1,57 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class RevealDeprecated { + + private final ClientApi api; + + public RevealDeprecated(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setReveal(String apikey, String reveal) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("reveal", reveal); + return api.callApi("reveal", "action", "setReveal", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java new file mode 100644 index 0000000..51df911 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java @@ -0,0 +1,123 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class ScriptDeprecated { + + private final ClientApi api; + + public ScriptDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse enable(String apikey, String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scriptName", scriptname); + return api.callApi("script", "action", "enable", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse disable(String apikey, String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scriptName", scriptname); + return api.callApi("script", "action", "disable", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse load( + String apikey, + String scriptname, + String scripttype, + String scriptengine, + String filename, + String scriptdescription) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scriptName", scriptname); + map.put("scriptType", scripttype); + map.put("scriptEngine", scriptengine); + map.put("fileName", filename); + if (scriptdescription != null) { + map.put("scriptDescription", scriptdescription); + } + return api.callApi("script", "action", "load", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse remove(String apikey, String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scriptName", scriptname); + return api.callApi("script", "action", "remove", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse runStandAloneScript(String apikey, String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scriptName", scriptname); + return api.callApi("script", "action", "runStandAloneScript", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java new file mode 100644 index 0000000..9dcb477 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java @@ -0,0 +1,136 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class SearchDeprecated { + + private final ClientApi api; + + public SearchDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByUrlRegex", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] harByRequestRegex(String apikey, String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByRequestRegex", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] harByResponseRegex(String apikey, String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByResponseRegex", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public byte[] harByHeaderRegex(String apikey, String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByHeaderRegex", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java new file mode 100644 index 0000000..f3ee119 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java @@ -0,0 +1,131 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class SeleniumDeprecated { + + private final ClientApi api; + + public SeleniumDeprecated(ClientApi api) { + this.api = api; + } + + /** + * Sets the current path to ChromeDriver + *

+ * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionChromeDriverPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionChromeDriverPath", map); + } + + /** + * Sets the current path to Firefox binary + *

+ * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxBinaryPath", map); + } + + /** + * Sets the current path to Firefox driver (geckodriver) + *

+ * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); + } + + /** + * Sets the current path to IEDriverServer + *

+ * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionIeDriverPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionIeDriverPath", map); + } + + /** + * Sets the current path to PhantomJS binary + *

+ * This component is optional and therefore the API will only work if it is installed + * + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java new file mode 100644 index 0000000..ef33b0c --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java @@ -0,0 +1,60 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class SessionManagementDeprecated { + + private final ClientApi api; + + public SessionManagementDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setSessionManagementMethod(String apikey, String contextid, String methodname, String methodconfigparams) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("methodName", methodname); + if (methodconfigparams != null) { + map.put("methodConfigParams", methodconfigparams); + } + return api.callApi("sessionManagement", "action", "setSessionManagementMethod", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java new file mode 100644 index 0000000..4af0b7f --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -0,0 +1,512 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class SpiderDeprecated { + + private final ClientApi api; + + public SpiderDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse scan( + String apikey, + String url, + String maxchildren, + String recurse, + String contextname, + String subtreeonly) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (url != null) { + map.put("url", url); + } + if (maxchildren != null) { + map.put("maxChildren", maxchildren); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (contextname != null) { + map.put("contextName", contextname); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("spider", "action", "scan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse scanAsUser( + String apikey, + String contextid, + String userid, + String url, + String maxchildren, + String recurse, + String subtreeonly) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + if (url != null) { + map.put("url", url); + } + if (maxchildren != null) { + map.put("maxChildren", maxchildren); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("spider", "action", "scanAsUser", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse pause(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("spider", "action", "pause", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse resume(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("spider", "action", "resume", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stop(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "action", "stop", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("scanId", scanid); + return api.callApi("spider", "action", "removeScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse pauseAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("spider", "action", "pauseAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse resumeAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("spider", "action", "resumeAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse stopAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("spider", "action", "stopAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeAllScans(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("spider", "action", "removeAllScans", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + return api.callApi("spider", "action", "clearExcludedFromScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("regex", regex); + return api.callApi("spider", "action", "excludeFromScan", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionHandleParameters(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("spider", "action", "setOptionHandleParameters", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionScopeString(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("spider", "action", "setOptionScopeString", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionSkipURLString(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("spider", "action", "setOptionSkipURLString", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionUserAgent(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("spider", "action", "setOptionUserAgent", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxDepth(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxDepth", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxDuration", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxScansInUI", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionParseComments(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseComments", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionParseGit(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseGit", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseRobotsTxt", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseSVNEntries", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseSitemapXml", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionPostForm(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionPostForm", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionProcessForm(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionProcessForm", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionRequestWaitTime(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionRequestWaitTime", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionSendRefererHeader", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionShowAdvancedDialog", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionThreadCount", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java new file mode 100644 index 0000000..250d5d3 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java @@ -0,0 +1,113 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class StatsDeprecated { + + private final ClientApi api; + + public StatsDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + if (keyprefix != null) { + map.put("keyPrefix", keyprefix); + } + return api.callApi("stats", "action", "clearStats", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionStatsdHost(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("stats", "action", "setOptionStatsdHost", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("String", string); + return api.callApi("stats", "action", "setOptionStatsdPrefix", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("stats", "action", "setOptionInMemoryEnabled", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setOptionStatsdPort(String apikey, int i) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("Integer", Integer.toString(i)); + return api.callApi("stats", "action", "setOptionStatsdPort", map); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java new file mode 100644 index 0000000..2d8e53d --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java @@ -0,0 +1,126 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** + * API implementation with deprecated methods, (re)moved from generated class. + */ +@SuppressWarnings("javadoc") +public class UsersDeprecated { + + private final ClientApi api; + + public UsersDeprecated(ClientApi api) { + this.api = api; + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse newUser(String apikey, String contextid, String name) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("name", name); + return api.callApi("users", "action", "newUser", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse removeUser(String apikey, String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "action", "removeUser", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setUserEnabled(String apikey, String contextid, String userid, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + map.put("enabled", enabled); + return api.callApi("users", "action", "setUserEnabled", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setUserName(String apikey, String contextid, String userid, String name) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + map.put("name", name); + return api.callApi("users", "action", "setUserName", map); + } + + /** + * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + */ + @Deprecated + public ApiResponse setAuthenticationCredentials( + String apikey, + String contextid, + String userid, + String authcredentialsconfigparams) throws ClientApiException { + Map map = new HashMap<>(); + if (apikey != null) { + map.put("apikey", apikey); + } + map.put("contextId", contextid); + map.put("userId", userid); + if (authcredentialsconfigparams != null) { + map.put("authCredentialsConfigParams", authcredentialsconfigparams); + } + return api.callApi("users", "action", "setAuthenticationCredentials", map); + } + +} From 7d72b597550c71f630671a3445f8576918307850 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 9 Mar 2017 11:23:46 +0000 Subject: [PATCH 014/148] Bump version number to 1.1.0 Update version in build.gradle and replace the version in since and deprecated JavaDoc tags. --- build.gradle | 2 +- .../org/zaproxy/clientapi/ant/AlertTask.java | 8 +- .../org/zaproxy/clientapi/core/Alert.java | 16 ++-- .../clientapi/core/ApiResponseSet.java | 16 ++-- .../org/zaproxy/clientapi/core/ClientApi.java | 14 ++-- .../gen/deprecated/AcsrfDeprecated.java | 6 +- .../gen/deprecated/AjaxSpiderDeprecated.java | 24 +++--- .../gen/deprecated/AscanDeprecated.java | 82 +++++++++---------- .../deprecated/AuthenticationDeprecated.java | 6 +- .../deprecated/AuthorizationDeprecated.java | 2 +- .../gen/deprecated/AutoupdateDeprecated.java | 18 ++-- .../gen/deprecated/BreakDeprecated.java | 6 +- .../gen/deprecated/ContextDeprecated.java | 22 ++--- .../gen/deprecated/CoreDeprecated.java | 72 ++++++++-------- .../gen/deprecated/ForcedUserDeprecated.java | 4 +- .../deprecated/HttpSessionsDeprecated.java | 16 ++-- .../deprecated/ImportLogFilesDeprecated.java | 10 +-- .../gen/deprecated/PnhDeprecated.java | 16 ++-- .../gen/deprecated/PscanDeprecated.java | 12 +-- .../gen/deprecated/RevealDeprecated.java | 2 +- .../gen/deprecated/ScriptDeprecated.java | 10 +-- .../gen/deprecated/SearchDeprecated.java | 8 +- .../gen/deprecated/SeleniumDeprecated.java | 10 +-- .../SessionManagementDeprecated.java | 2 +- .../gen/deprecated/SpiderDeprecated.java | 62 +++++++------- .../gen/deprecated/StatsDeprecated.java | 10 +-- .../gen/deprecated/UsersDeprecated.java | 10 +-- 27 files changed, 233 insertions(+), 233 deletions(-) diff --git a/build.gradle b/build.gradle index 6db7a16..e18d752 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.1.0-SNAPSHOT' + version '1.1.0' ext.versionBC = '1.0.0' repositories { diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index babe3b9..83e3ffc 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -39,7 +39,7 @@ public class AlertTask extends Task { * Gets the name of the alert. * * @return the name of the alert - * @since TODO add version + * @since 1.1.0 */ public String getName() { return name; @@ -49,7 +49,7 @@ public String getName() { * Sets the name of the alert. * * @param name the name of the alert - * @since TODO add version + * @since 1.1.0 */ public void setName(String name) { this.name = name; @@ -59,7 +59,7 @@ public void setName(String name) { * Gets the name of the alert. * * @return the name of the alert - * @deprecated (TODO add version) Use {@link #getName()} instead. + * @deprecated (1.1.0) Use {@link #getName()} instead. */ @Deprecated public String getAlert() { @@ -70,7 +70,7 @@ public String getAlert() { * Sets the name of the alert. * * @param name the name of the alert - * @deprecated (TODO add version) Use {@link #setName(String)} instead. + * @deprecated (1.1.0) Use {@link #setName(String)} instead. */ @Deprecated public void setAlert(String name) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index e180650..fdf46e2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -58,7 +58,7 @@ public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; * Constructs an {@code Alert} from the given {@code ApiResponseSet}. * * @param apiResponseSet the {@code ApiResponseSet} returned from an alert related ZAP API call. - * @since TODO add version + * @since 1.1.0 */ public Alert(ApiResponseSet apiResponseSet) { super(); @@ -195,7 +195,7 @@ private static Confidence stringToConfidence(String string) { * Gets the ID of the alert. * * @return the ID of the alert. - * @since TODO add version + * @since 1.1.0 */ public String getId() { return id; @@ -205,7 +205,7 @@ public String getId() { * Gets the ID of the plugin/scanner that raised the alert. * * @return the ID of the plugin/scanner that raised the alert. - * @since TODO add version + * @since 1.1.0 */ public String getPluginId() { return pluginId; @@ -215,7 +215,7 @@ public String getPluginId() { * Gets the ID of the HTTP message of the alert. * * @return the ID of the HTTP message. - * @since TODO add version + * @since 1.1.0 */ public String getMessageId() { return messageId; @@ -225,7 +225,7 @@ public String getMessageId() { * Gets the name of the alert. * * @return the name of the alert - * @since TODO add version + * @since 1.1.0 */ public String getName() { return name; @@ -235,7 +235,7 @@ public String getName() { * Sets the name of the alert. * * @param name the name of the alert - * @since TODO add version + * @since 1.1.0 */ public void setName(String name) { this.name = name; @@ -245,7 +245,7 @@ public void setName(String name) { * Gets the name of the alert. * * @return the name of the alert - * @deprecated (TODO add version) Use {@link #getName()} instead. + * @deprecated (1.1.0) Use {@link #getName()} instead. */ @Deprecated public String getAlert() { @@ -255,7 +255,7 @@ public String getAlert() { * Sets the name of the alert. * * @param name the name of the alert - * @deprecated (TODO add version) Use {@link #setName(String)} instead. + * @deprecated (1.1.0) Use {@link #setName(String)} instead. */ @Deprecated public void setAlert(String name) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java index c9f5a5a..d6d1c9b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java @@ -36,7 +36,7 @@ public class ApiResponseSet extends ApiResponse { * * @param name the name of the API response * @param attributes the attributes - * @deprecated (TODO add version) Unused, there's no replacement. + * @deprecated (1.1.0) Unused, there's no replacement. */ @Deprecated public ApiResponseSet(String name, String[] attributes) { @@ -66,7 +66,7 @@ public ApiResponseSet(Node node) throws ClientApiException { * Gets the attributes. * * @return the attributes, might be {@code null}. - * @deprecated (TODO add version) Unused, there's no replacement. + * @deprecated (1.1.0) Unused, there's no replacement. * @see #getValues() */ @Deprecated @@ -79,7 +79,7 @@ public String[] getAttributes() { * * @param key the key of the value * @return the value, or {@code null} if no value exists for the given {@code key}. - * @deprecated (TODO add version) Use {@link #getStringValue(String)} or {@link #getValue(String)} instead. + * @deprecated (1.1.0) Use {@link #getStringValue(String)} or {@link #getValue(String)} instead. */ @Deprecated public String getAttribute(String key) { @@ -91,7 +91,7 @@ public String getAttribute(String key) { * * @param key the key of the value * @return the value, or {@code null} if no value exists for the given {@code key}. - * @since TODO add version + * @since 1.1.0 * @see #getKeys() * @see #getStringValue(String) */ @@ -107,7 +107,7 @@ public ApiResponse getValue(String key) { * * @param key the key of the value * @return the value, or {@code null} if no value exists for the given {@code key}. - * @since TODO add version + * @since 1.1.0 * @see #getKeys() * @see #getValue(String) */ @@ -126,7 +126,7 @@ public String getStringValue(String key) { * {@code UnsupportedOperationException}. * * @return the map with the keys/values, never {@code null}. - * @since TODO add version + * @since 1.1.0 */ public Map getValuesMap() { return valuesMap; @@ -139,7 +139,7 @@ public Map getValuesMap() { * {@code UnsupportedOperationException}. * * @return the keys, never {@code null}. - * @since TODO add version + * @since 1.1.0 * @see #getValue(String) * @see #getStringValue(String) * @see #getValues() @@ -156,7 +156,7 @@ public Set getKeys() { * {@code UnsupportedOperationException}. * * @return the values, never {@code null}. - * @since TODO add version + * @since 1.1.0 * @see #getValue(String) * @see #getStringValue(String) */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 7d2e50f..1dcd4a8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -125,7 +125,7 @@ public ClientApi (String zapAddress, int zapPort) { * @param zapAddress ZAP's address * @param zapPort ZAP's listening port * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. - * @since TODO add version + * @since 1.1.0 */ public ClientApi(String zapAddress, int zapPort, String apiKey) { this(zapAddress, zapPort, apiKey, false); @@ -144,7 +144,7 @@ public ClientApi (String zapAddress, int zapPort, boolean debug) { * @param zapPort ZAP's listening port * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. * @param debug {@code true} if debug information should be written to debug stream, {@code false} otherwise. - * @since TODO add version + * @since 1.1.0 */ public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); @@ -423,7 +423,7 @@ private static String encodeQueryParam(String param) { * @param contextName the name of the context. * @param regex the regular expression to add. * @throws Exception if an error occurred while calling the API. - * @deprecated (TODO add version) Use {@link Context#excludeFromContext(String, String)} instead. + * @deprecated (1.1.0) Use {@link Context#excludeFromContext(String, String)} instead. * @see #context */ @Deprecated @@ -438,7 +438,7 @@ public void addExcludeFromContext(String apikey, String contextName, String rege * @param contextName the name of the context. * @param regex the regular expression to add. * @throws Exception if an error occurred while calling the API. - * @deprecated (TODO add version) Use {@link Context#includeInContext(String, String)} instead. + * @deprecated (1.1.0) Use {@link Context#includeInContext(String, String)} instead. * @see #context */ @Deprecated @@ -455,7 +455,7 @@ public void addIncludeInContext(String apikey, String contextName, String regex) * @param contextName the name of the context. * @param regex the regular expression to match the node/URL. * @throws Exception if an error occurred while calling the API. - * @deprecated (TODO add version) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. + * @deprecated (1.1.0) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. */ @Deprecated public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) throws Exception { @@ -524,7 +524,7 @@ private List getSessionUrls() throws Exception { * @param apikey the API key, might be {@code null}. * @param url the site to scan * @throws Exception if an error occurred while calling the API. - * @deprecated (TODO add version) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of + * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of * the {@code ClientApi} constructors. */ @Deprecated @@ -540,7 +540,7 @@ public void activeScanSiteInScope(String apikey, String url) throws Exception { * * @param url the site to scan * @throws Exception if an error occurred while calling the API. - * @since TODO add version + * @since 1.1.0 */ public void activeScanSiteInScope(String url) throws Exception { ascan.scan(url, "true", "true", "", "", ""); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java index 0eb2ade..7ca9813 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java @@ -39,7 +39,7 @@ public AcsrfDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -53,7 +53,7 @@ public ApiResponse addOptionToken(String apikey, String string) throws ClientApi } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -67,7 +67,7 @@ public ApiResponse removeOptionToken(String apikey, String string) throws Client } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java index 20e01a5..002568f 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java @@ -41,7 +41,7 @@ public AjaxSpiderDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed. * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -62,7 +62,7 @@ public ApiResponse scan(String apikey, String url, String inscope) throws Client /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -77,7 +77,7 @@ public ApiResponse stop(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -93,7 +93,7 @@ public ApiResponse setOptionBrowserId(String apikey, String string) throws Clien /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -109,7 +109,7 @@ public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throw /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -125,7 +125,7 @@ public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws C /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -141,7 +141,7 @@ public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -157,7 +157,7 @@ public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApi /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -173,7 +173,7 @@ public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientAp /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -189,7 +189,7 @@ public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -205,7 +205,7 @@ public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws Client /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -221,7 +221,7 @@ public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws Cli /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java index ab097fc..e25a94a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java @@ -39,7 +39,7 @@ public AscanDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -75,7 +75,7 @@ public ApiResponse scan( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -111,7 +111,7 @@ public ApiResponse scanAsUser( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -125,7 +125,7 @@ public ApiResponse pause(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -139,7 +139,7 @@ public ApiResponse resume(String apikey, String scanid) throws ClientApiExceptio } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -153,7 +153,7 @@ public ApiResponse stop(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -167,7 +167,7 @@ public ApiResponse removeScan(String apikey, String scanid) throws ClientApiExce } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -180,7 +180,7 @@ public ApiResponse pauseAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -193,7 +193,7 @@ public ApiResponse resumeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -206,7 +206,7 @@ public ApiResponse stopAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -219,7 +219,7 @@ public ApiResponse removeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -232,7 +232,7 @@ public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiExceptio } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -246,7 +246,7 @@ public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApi } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -262,7 +262,7 @@ public ApiResponse enableAllScanners(String apikey, String scanpolicyname) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -278,7 +278,7 @@ public ApiResponse disableAllScanners(String apikey, String scanpolicyname) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -295,7 +295,7 @@ public ApiResponse enableScanners(String apikey, String ids, String scanpolicyna } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -312,7 +312,7 @@ public ApiResponse disableScanners(String apikey, String ids, String scanpolicyn } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -329,7 +329,7 @@ public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpoli } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -348,7 +348,7 @@ public ApiResponse setPolicyAttackStrength(String apikey, String id, String atta } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -367,7 +367,7 @@ public ApiResponse setPolicyAlertThreshold(String apikey, String id, String aler } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -386,7 +386,7 @@ public ApiResponse setScannerAttackStrength(String apikey, String id, String att } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -405,7 +405,7 @@ public ApiResponse setScannerAlertThreshold(String apikey, String id, String ale } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -419,7 +419,7 @@ public ApiResponse addScanPolicy(String apikey, String scanpolicyname) throws Cl } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -433,7 +433,7 @@ public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -447,7 +447,7 @@ public ApiResponse setOptionAttackPolicy(String apikey, String string) throws Cl } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -461,7 +461,7 @@ public ApiResponse setOptionDefaultPolicy(String apikey, String string) throws C } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -475,7 +475,7 @@ public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -489,7 +489,7 @@ public ApiResponse setOptionDelayInMs(String apikey, int i) throws ClientApiExce } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -503,7 +503,7 @@ public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) th } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -517,7 +517,7 @@ public ApiResponse setOptionHostPerScan(String apikey, int i) throws ClientApiEx } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -531,7 +531,7 @@ public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -545,7 +545,7 @@ public ApiResponse setOptionMaxChartTimeInMins(String apikey, int i) throws Clie } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -559,7 +559,7 @@ public ApiResponse setOptionMaxResultsToList(String apikey, int i) throws Client } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -573,7 +573,7 @@ public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiE } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -587,7 +587,7 @@ public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -601,7 +601,7 @@ public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bo } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -615,7 +615,7 @@ public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -629,7 +629,7 @@ public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -643,7 +643,7 @@ public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -657,7 +657,7 @@ public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -671,7 +671,7 @@ public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java index 9a73ddf..03bc878 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java @@ -39,7 +39,7 @@ public AuthenticationDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -61,7 +61,7 @@ public ApiResponse setAuthenticationMethod( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -77,7 +77,7 @@ public ApiResponse setLoggedInIndicator(String apikey, String contextid, String } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java index 1f6c6cb..22fdabf 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java @@ -39,7 +39,7 @@ public AuthorizationDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java index 4f5242b..23d4b36 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java @@ -39,7 +39,7 @@ public AutoupdateDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -52,7 +52,7 @@ public ApiResponse downloadLatestRelease(String apikey) throws ClientApiExceptio } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -66,7 +66,7 @@ public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -80,7 +80,7 @@ public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) throws Cli } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -94,7 +94,7 @@ public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -108,7 +108,7 @@ public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -122,7 +122,7 @@ public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -136,7 +136,7 @@ public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -150,7 +150,7 @@ public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java index 6f8981a..9d17fb7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java @@ -39,7 +39,7 @@ public BreakDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -55,7 +55,7 @@ public ApiResponse brk(String apikey, String type, String scope, String state) t } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -79,7 +79,7 @@ public ApiResponse addHttpBreakpoint( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java index f1f36f0..100a436 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java @@ -39,7 +39,7 @@ public ContextDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -54,7 +54,7 @@ public ApiResponse excludeFromContext(String apikey, String contextname, String } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -69,7 +69,7 @@ public ApiResponse includeInContext(String apikey, String contextname, String re } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -83,7 +83,7 @@ public ApiResponse newContext(String apikey, String contextname) throws ClientAp } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -97,7 +97,7 @@ public ApiResponse removeContext(String apikey, String contextname) throws Clien } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -112,7 +112,7 @@ public ApiResponse exportContext(String apikey, String contextname, String conte } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -126,7 +126,7 @@ public ApiResponse importContext(String apikey, String contextfile) throws Clien } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -142,7 +142,7 @@ public ApiResponse includeContextTechnologies(String apikey, String contextname, } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -156,7 +156,7 @@ public ApiResponse includeAllContextTechnologies(String apikey, String contextna } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -172,7 +172,7 @@ public ApiResponse excludeContextTechnologies(String apikey, String contextname, } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -186,7 +186,7 @@ public ApiResponse excludeAllContextTechnologies(String apikey, String contextna } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java index 44a42f7..826b38e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -39,7 +39,7 @@ public CoreDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -56,7 +56,7 @@ public ApiResponse accessUrl(String apikey, String url, String followredirects) } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -69,7 +69,7 @@ public ApiResponse shutdown(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -88,7 +88,7 @@ public ApiResponse newSession(String apikey, String name, String overwrite) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -102,7 +102,7 @@ public ApiResponse loadSession(String apikey, String name) throws ClientApiExcep } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -119,7 +119,7 @@ public ApiResponse saveSession(String apikey, String name, String overwrite) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -132,7 +132,7 @@ public ApiResponse snapshotSession(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -145,7 +145,7 @@ public ApiResponse clearExcludedFromProxy(String apikey) throws ClientApiExcepti } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -159,7 +159,7 @@ public ApiResponse excludeFromProxy(String apikey, String regex) throws ClientAp } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -173,7 +173,7 @@ public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiE } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -187,7 +187,7 @@ public ApiResponse setMode(String apikey, String mode) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -200,7 +200,7 @@ public ApiResponse generateRootCA(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -217,7 +217,7 @@ public ApiResponse sendRequest(String apikey, String request, String followredir } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -230,7 +230,7 @@ public ApiResponse deleteAllAlerts(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -243,7 +243,7 @@ public ApiResponse runGarbageCollection(String apikey) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -263,7 +263,7 @@ public ApiResponse deleteSiteNode(String apikey, String url, String method, Stri } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -277,7 +277,7 @@ public ApiResponse setOptionDefaultUserAgent(String apikey, String string) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -291,7 +291,7 @@ public ApiResponse setOptionProxyChainName(String apikey, String string) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -305,7 +305,7 @@ public ApiResponse setOptionProxyChainPassword(String apikey, String string) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -319,7 +319,7 @@ public ApiResponse setOptionProxyChainRealm(String apikey, String string) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -333,7 +333,7 @@ public ApiResponse setOptionProxyChainSkipName(String apikey, String string) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -347,7 +347,7 @@ public ApiResponse setOptionProxyChainUserName(String apikey, String string) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -361,7 +361,7 @@ public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -375,7 +375,7 @@ public ApiResponse setOptionProxyChainPort(String apikey, int i) throws ClientAp } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -389,7 +389,7 @@ public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -403,7 +403,7 @@ public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean boo } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -417,7 +417,7 @@ public ApiResponse setOptionTimeoutInSecs(String apikey, int i) throws ClientApi } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -431,7 +431,7 @@ public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) throws Cl } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -445,7 +445,7 @@ public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -458,7 +458,7 @@ public byte[] proxypac(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -471,7 +471,7 @@ public byte[] rootcert(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -485,7 +485,7 @@ public byte[] setproxy(String apikey, String proxy) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -498,7 +498,7 @@ public byte[] xmlreport(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -511,7 +511,7 @@ public byte[] htmlreport(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -525,7 +525,7 @@ public byte[] messageHar(String apikey, String id) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -547,7 +547,7 @@ public byte[] messagesHar(String apikey, String baseurl, String start, String co } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java index f168cc7..90d6021 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java @@ -39,7 +39,7 @@ public ForcedUserDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -54,7 +54,7 @@ public ApiResponse setForcedUser(String apikey, String contextid, String userid) } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java index c2eb6e8..d5e5259 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java @@ -39,7 +39,7 @@ public HttpSessionsDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -56,7 +56,7 @@ public ApiResponse createEmptySession(String apikey, String site, String session } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -71,7 +71,7 @@ public ApiResponse removeSession(String apikey, String site, String session) thr } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -86,7 +86,7 @@ public ApiResponse setActiveSession(String apikey, String site, String session) } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -100,7 +100,7 @@ public ApiResponse unsetActiveSession(String apikey, String site) throws ClientA } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -115,7 +115,7 @@ public ApiResponse addSessionToken(String apikey, String site, String sessiontok } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -130,7 +130,7 @@ public ApiResponse removeSessionToken(String apikey, String site, String session } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -148,7 +148,7 @@ public ApiResponse setSessionTokenValue(String apikey, String site, String sessi } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java index 039b10f..8685bac 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java @@ -41,7 +41,7 @@ public ImportLogFilesDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -57,7 +57,7 @@ public ApiResponse ImportZAPLogFromFile(String apikey, String filepath) throws C /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -73,7 +73,7 @@ public ApiResponse ImportModSecurityLogFromFile(String apikey, String filepath) /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -90,7 +90,7 @@ public ApiResponse ImportZAPHttpRequestResponsePair(String apikey, String httpre /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -108,7 +108,7 @@ public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstr /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java index 9cde76a..8777b69 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java @@ -41,7 +41,7 @@ public PnhDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -58,7 +58,7 @@ public ApiResponse monitor(String apikey, String id, String message) throws Clie /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -74,7 +74,7 @@ public ApiResponse oracle(String apikey, String id) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -90,7 +90,7 @@ public ApiResponse startMonitoring(String apikey, String url) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -106,7 +106,7 @@ public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -121,7 +121,7 @@ public byte[] pnh(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -136,7 +136,7 @@ public byte[] manifest(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -151,7 +151,7 @@ public byte[] service(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java index d69ae43..43ef865 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java @@ -39,7 +39,7 @@ public PscanDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -53,7 +53,7 @@ public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiExc } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -66,7 +66,7 @@ public ApiResponse enableAllScanners(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -79,7 +79,7 @@ public ApiResponse disableAllScanners(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -93,7 +93,7 @@ public ApiResponse enableScanners(String apikey, String ids) throws ClientApiExc } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -107,7 +107,7 @@ public ApiResponse disableScanners(String apikey, String ids) throws ClientApiEx } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java index f425134..3afc333 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java @@ -41,7 +41,7 @@ public RevealDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java index 51df911..5d6b128 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java @@ -39,7 +39,7 @@ public ScriptDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -53,7 +53,7 @@ public ApiResponse enable(String apikey, String scriptname) throws ClientApiExce } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -67,7 +67,7 @@ public ApiResponse disable(String apikey, String scriptname) throws ClientApiExc } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -93,7 +93,7 @@ public ApiResponse load( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -107,7 +107,7 @@ public ApiResponse remove(String apikey, String scriptname) throws ClientApiExce } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java index 9dcb477..9abb72e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java @@ -38,7 +38,7 @@ public SearchDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -62,7 +62,7 @@ public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -86,7 +86,7 @@ public byte[] harByRequestRegex(String apikey, String regex, String baseurl, Str } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -110,7 +110,7 @@ public byte[] harByResponseRegex(String apikey, String regex, String baseurl, St } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java index f3ee119..cdb78c6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java @@ -43,7 +43,7 @@ public SeleniumDeprecated(ClientApi api) { *

* This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -61,7 +61,7 @@ public ApiResponse setOptionChromeDriverPath(String apikey, String string) throw *

* This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -79,7 +79,7 @@ public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) thro *

* This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -97,7 +97,7 @@ public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) thro *

* This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -115,7 +115,7 @@ public ApiResponse setOptionIeDriverPath(String apikey, String string) throws Cl *

* This component is optional and therefore the API will only work if it is installed * - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java index ef33b0c..78ebd5c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java @@ -39,7 +39,7 @@ public SessionManagementDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java index 4af0b7f..35737d3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -39,7 +39,7 @@ public SpiderDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -73,7 +73,7 @@ public ApiResponse scan( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -107,7 +107,7 @@ public ApiResponse scanAsUser( } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -121,7 +121,7 @@ public ApiResponse pause(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -135,7 +135,7 @@ public ApiResponse resume(String apikey, String scanid) throws ClientApiExceptio } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -151,7 +151,7 @@ public ApiResponse stop(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -165,7 +165,7 @@ public ApiResponse removeScan(String apikey, String scanid) throws ClientApiExce } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -178,7 +178,7 @@ public ApiResponse pauseAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -191,7 +191,7 @@ public ApiResponse resumeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -204,7 +204,7 @@ public ApiResponse stopAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -217,7 +217,7 @@ public ApiResponse removeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -230,7 +230,7 @@ public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiExceptio } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -244,7 +244,7 @@ public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApi } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -258,7 +258,7 @@ public ApiResponse setOptionHandleParameters(String apikey, String string) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -272,7 +272,7 @@ public ApiResponse setOptionScopeString(String apikey, String string) throws Cli } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -286,7 +286,7 @@ public ApiResponse setOptionSkipURLString(String apikey, String string) throws C } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -300,7 +300,7 @@ public ApiResponse setOptionUserAgent(String apikey, String string) throws Clien } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -314,7 +314,7 @@ public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -328,7 +328,7 @@ public ApiResponse setOptionMaxDepth(String apikey, int i) throws ClientApiExcep } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -342,7 +342,7 @@ public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiEx } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -356,7 +356,7 @@ public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiE } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -370,7 +370,7 @@ public ApiResponse setOptionParseComments(String apikey, boolean bool) throws Cl } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -384,7 +384,7 @@ public ApiResponse setOptionParseGit(String apikey, boolean bool) throws ClientA } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -398,7 +398,7 @@ public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) throws C } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -412,7 +412,7 @@ public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -426,7 +426,7 @@ public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -440,7 +440,7 @@ public ApiResponse setOptionPostForm(String apikey, boolean bool) throws ClientA } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -454,7 +454,7 @@ public ApiResponse setOptionProcessForm(String apikey, boolean bool) throws Clie } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -468,7 +468,7 @@ public ApiResponse setOptionRequestWaitTime(String apikey, int i) throws ClientA } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -482,7 +482,7 @@ public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) throw } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -496,7 +496,7 @@ public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) thro } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java index 250d5d3..155338e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java @@ -39,7 +39,7 @@ public StatsDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -55,7 +55,7 @@ public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiE } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -69,7 +69,7 @@ public ApiResponse setOptionStatsdHost(String apikey, String string) throws Clie } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -83,7 +83,7 @@ public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws Cl } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -97,7 +97,7 @@ public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java index 2d8e53d..33bb8b4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java @@ -39,7 +39,7 @@ public UsersDeprecated(ClientApi api) { } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -54,7 +54,7 @@ public ApiResponse newUser(String apikey, String contextid, String name) throws } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -69,7 +69,7 @@ public ApiResponse removeUser(String apikey, String contextid, String userid) th } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -86,7 +86,7 @@ public ApiResponse setUserEnabled(String apikey, String contextid, String userid } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated @@ -102,7 +102,7 @@ public ApiResponse setUserName(String apikey, String contextid, String userid, S } /** - * @deprecated (TODO add version) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). */ @Deprecated From d3d6d8ea41ab9b29065540b51b36b8e52e4a8a72 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 9 Mar 2017 11:30:22 +0000 Subject: [PATCH 015/148] Bump version number to 1.2.0-SNAPSHOT --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e18d752..d79b6d8 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.1.0' + version '1.2.0-SNAPSHOT' ext.versionBC = '1.0.0' repositories { From ccc93c54590c6846e8af0bc3502470d1eea608d6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 9 Mar 2017 14:15:53 +0000 Subject: [PATCH 016/148] Bumped version number to 1.1.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e18d752..54c824e 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.1.0' + version '1.1.1' ext.versionBC = '1.0.0' repositories { From 01668dbe40513c4d75e88b8f48d627fe504998d0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 9 Mar 2017 14:29:32 +0000 Subject: [PATCH 017/148] Send API key even if there are no parameters Change ClientApi to send the API key as parameter even if there are no other parameters, older ZAP versions might need it as (query) parameter. Allows to use non-deprecated methods (that don't have any parameters) with older/current ZAP version. --- .../main/java/org/zaproxy/clientapi/core/ClientApi.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 1dcd4a8..985dfde 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -398,6 +398,13 @@ private HttpRequest buildZapRequest( } sb.append('&'); } + } else if (apiKey != null && !apiKey.isEmpty()) { + // Send the API key even if there are no parameters, + // older ZAP versions might need it as (query) parameter. + sb.append('?'); + sb.append(encodeQueryParam(ZAP_API_KEY_PARAM)); + sb.append('='); + sb.append(encodeQueryParam(apiKey)); } HttpRequest request = new HttpRequest(new URL(sb.toString())); From a502bfd5e038e6482ec82518387e27f519bc3a92 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 3 Jan 2017 11:17:43 +0000 Subject: [PATCH 018/148] Update README with instructions to build/release Add instructions on how to build, install and release the artifacts. --- README.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e5c1a3e..ffc940a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.0.0` + * Version: `1.1.1` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). @@ -31,3 +31,104 @@ For help using OWASP ZAP API refer to: ## Issues To report issues related to OWASP ZAP API, bugs and enhancements requests, use the [issue tracker of the main OWASP ZAP project](https://github.com/zaproxy/zaproxy/issues). + +## Building + +This project uses Gradle to build its libraries, for example, running: + + ./gradlew build + +in the main directory of the project will build all the libraries. The libraries will be located in the `build/libs` directory +of each subproject. + +### Installing + +To install the artifacts to the local Maven repository you can run the following: + + ./gradlew install + +The installed artifacts (`zap-clientapi`) are then available for other (local) projects to use. + +## Releasing + +In the following sections it will be explained the steps necessary to release a new version of the libraries. In all steps the +version to be released is referred to as ``, which should be replaced with appropriate version number +(e.g. 2.1.0). + +### Release Branching + +The project follows the [git-flow branching model](http://nvie.com/posts/a-successful-git-branching-model/). To release a new version it needs to be created a new release branch, update the version, and tag: + 1. Create a release branch: + `git checkout -b release- develop`; + 2. Update version in: + 1. `build.gradle` file (e.g. remove `-SNAPSHOT`); + 2. source code (e.g. `@since` and `@deprecated` JavaDoc tags); + 3. `README.md` file (in `How to Obtain` section); + 3. Review that everything is correct and commit the changes: + `git commit -S -m "Bump version number to "` + 4. Checkout `master` and merge the release branch: + 1. `git checkout master` + 2. `git merge -S --no-ff release- -m "Merge branch 'release-' into master"` + 5. Tag the new version: + `git tag -s v -m "Version "` + +Reintegrate the changes into `develop` branch: + 1. Checkout develop branch: + `git checkout develop` + 2. Merge the `release-` branch: + `git merge -S --no-ff release- -m "Merge branch 'release-' into develop"` + 1. Resolve possible conflicts; + 1. The version can be bumped to the next developing version (e.g. increase the minor version and add `-SNAPSHOT`); + 2. Continue with the merge (if the version was bumped mention it in the commit message); + 3. Bump to the next developing version now (e.g. increase the minor version and add `-SNAPSHOT`), if not done during the merge: + `git commit -S -m "Bump version number to -SNAPSHOT"` + +Delete the release branch: + + git branch -d release- + +Push the branches (`develop` and `master`) and tag: + + git push upstream develop master v + +(Assuming `upstream` is the zaproxy repo.) + +### Build for Release + +Checkout the tagged version: + + git checkout v + +Create the the artifacts/libraries necessary for the release: + + ./gradlew clean build uberJar + +### Release to Maven Central + +To upload the built artifacts to OSSRH you can run the following: + + ./gradlew uploadArchives + +Once uploaded continue with the release process in OSSRH: +http://central.sonatype.org/pages/releasing-the-deployment.html + +NOTE: The following properties must be defined (e.g. in file `GRADLE_HOME/gradle.properties` ) to successfully sign and +upload the artifacts: + - `signing.keyId` - the ID of the GPG key, used to sign the artifacts; + - `ossrhUsername` - the OSSRH username; + - `ossrhPassword` - the OSSRH password for above username. + +Also, the user must have permissions to upload to GroupId `org.zaproxy`. + +### GitHub Release + +Release in GitHub: + 1. Draft a [new release](https://github.com/zaproxy/zap-api-java/releases/new): + - Tag: `v` + - Title: `Version ` + - Description: (Add a summary of the changes done in the new version and mention the artifacts/libraries available.) + 2. Upload the libraries: + - `zap-api-.jar` + - `zap-clientapi-.jar` + - `zap-clientapi-ant-.jar` + 3. Publish release. From 81ccd7c250b0ca57330218eb69c4a8cd286fa5f6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Mar 2017 16:30:30 +0000 Subject: [PATCH 019/148] Regenerate AJAX Spider API (v17) Regenerate the AJAX Spider API to match the latest version, which allows to obtain the full results of a scan (requests in and out of scope and requests with I/O errors). --- .../main/java/org/zaproxy/clientapi/gen/AjaxSpider.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 491c6c4..3f82a63 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -68,6 +68,13 @@ public ApiResponse numberOfResults() throws ClientApiException { return api.callApi("ajaxSpider", "view", "numberOfResults", null); } + /** + * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse fullResults() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "fullResults", null); + } + /** * This component is optional and therefore the API will only work if it is installed */ From 5757301f25336aa691307ae2930a7c76f58e9092 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 27 Mar 2017 15:49:41 +0100 Subject: [PATCH 020/148] Regenerate core APIs for ZAP version 2.6.0 Regenerate core APIs for ZAP version 2.6.0 (some tweaks were done to keep the API client binary compatible with previous versions). --- .../java/org/zaproxy/clientapi/gen/Acsrf.java | 8 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 152 ++++++++++++++++- .../org/zaproxy/clientapi/gen/Autoupdate.java | 46 ++++++ .../java/org/zaproxy/clientapi/gen/Break.java | 76 ++++++++- .../java/org/zaproxy/clientapi/gen/Core.java | 156 ++++++++++++++++-- .../zaproxy/clientapi/gen/HttpSessions.java | 9 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 18 +- .../org/zaproxy/clientapi/gen/Spider.java | 117 ++++++++++++- 8 files changed, 551 insertions(+), 31 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index 343c10f..cac4606 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -41,14 +41,14 @@ public Acsrf(ClientApi api) { } /** - * Lists the names of all anti CSRF tokens + * Lists the names of all anti-CSRF tokens */ public ApiResponse optionTokensNames() throws ClientApiException { return api.callApi("acsrf", "view", "optionTokensNames", null); } /** - * Adds an anti CSRF token with the given name, enabled by default + * Adds an anti-CSRF token with the given name, enabled by default */ public ApiResponse addOptionToken(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -57,7 +57,7 @@ public ApiResponse addOptionToken(String string) throws ClientApiException { } /** - * Removes the anti CSRF token with the given name + * Removes the anti-CSRF token with the given name */ public ApiResponse removeOptionToken(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -66,7 +66,7 @@ public ApiResponse removeOptionToken(String string) throws ClientApiException { } /** - * Generate a form for testing lack of anti CSRF tokens - typically invoked via ZAP + * Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ public byte[] genForm(String hrefid) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index f5a98f3..62e9db3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -76,6 +76,9 @@ public ApiResponse scanPolicyNames() throws ClientApiException { return api.callApi("ascan", "view", "scanPolicyNames", null); } + /** + * Gets the regexes of URLs excluded from the active scans. + */ public ApiResponse excludedFromScan() throws ClientApiException { return api.callApi("ascan", "view", "excludedFromScan", null); } @@ -106,6 +109,29 @@ public ApiResponse attackModeQueue() throws ClientApiException { return api.callApi("ascan", "view", "attackModeQueue", null); } + /** + * Gets all the parameters that are excluded. For each parameter the following are shown: the name, the URL, and the parameter type. + */ + public ApiResponse excludedParams() throws ClientApiException { + return api.callApi("ascan", "view", "excludedParams", null); + } + + /** + * Use view excludedParams instead. + * @deprecated + */ + @Deprecated + public ApiResponse optionExcludedParamList() throws ClientApiException { + return api.callApi("ascan", "view", "optionExcludedParamList", null); + } + + /** + * Gets all the types of excluded parameters. For each type the following are shown: the ID and the name. + */ + public ApiResponse excludedParamTypes() throws ClientApiException { + return api.callApi("ascan", "view", "excludedParamTypes", null); + } + public ApiResponse optionAttackPolicy() throws ClientApiException { return api.callApi("ascan", "view", "optionAttackPolicy", null); } @@ -118,10 +144,6 @@ public ApiResponse optionDelayInMs() throws ClientApiException { return api.callApi("ascan", "view", "optionDelayInMs", null); } - public ApiResponse optionExcludedParamList() throws ClientApiException { - return api.callApi("ascan", "view", "optionExcludedParamList", null); - } - public ApiResponse optionHandleAntiCSRFTokens() throws ClientApiException { return api.callApi("ascan", "view", "optionHandleAntiCSRFTokens", null); } @@ -138,6 +160,14 @@ public ApiResponse optionMaxResultsToList() throws ClientApiException { return api.callApi("ascan", "view", "optionMaxResultsToList", null); } + public ApiResponse optionMaxRuleDurationInMins() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxRuleDurationInMins", null); + } + + public ApiResponse optionMaxScanDurationInMins() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxScanDurationInMins", null); + } + public ApiResponse optionMaxScansInUI() throws ClientApiException { return api.callApi("ascan", "view", "optionMaxScansInUI", null); } @@ -158,6 +188,9 @@ public ApiResponse optionAllowAttackOnStart() throws ClientApiException { return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); } + /** + * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, with the ID of the scanner that's sending the requests. + */ public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); } @@ -186,8 +219,17 @@ public ApiResponse optionShowAdvancedDialog() throws ClientApiException { } public ApiResponse scan(String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata) throws ClientApiException { + return scan(url, recurse, inscopeonly, scanpolicyname, method, postdata, (Integer) null); + } + + /** + * Runs the active scanner against the given URL and/or Context. Optionally, the 'recurse' parameter can be used to scan URLs under the given URL, the parameter 'inScopeOnly' can be used to constrain the scan to URLs that are in scope (ignored if a Context is specified), the parameter 'scanPolicyName' allows to specify the scan policy (if none is given it uses the default scan policy), the parameters 'method' and 'postData' allow to select a given request in conjunction with the given URL. + */ + public ApiResponse scan(String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata, Integer contextid) throws ClientApiException { Map map = new HashMap<>(); - map.put("url", url); + if (url != null) { + map.put("url", url); + } if (recurse != null) { map.put("recurse", recurse); } @@ -203,6 +245,9 @@ public ApiResponse scan(String url, String recurse, String inscopeonly, String s if (postdata != null) { map.put("postData", postdata); } + if (contextid != null) { + map.put("contextId", contextid.toString()); + } return api.callApi("ascan", "action", "scan", map); } @@ -211,9 +256,15 @@ public ApiResponse scan(String url, String recurse, String inscopeonly, String s */ public ApiResponse scanAsUser(String url, String contextid, String userid, String recurse, String scanpolicyname, String method, String postdata) throws ClientApiException { Map map = new HashMap<>(); - map.put("url", url); - map.put("contextId", contextid); - map.put("userId", userid); + if (url != null) { + map.put("url", url); + } + if (contextid != null) { + map.put("contextId", contextid); + } + if (userid != null) { + map.put("userId", userid); + } if (recurse != null) { map.put("recurse", recurse); } @@ -269,10 +320,16 @@ public ApiResponse removeAllScans() throws ClientApiException { return api.callApi("ascan", "action", "removeAllScans", null); } + /** + * Clears the regexes of URLs excluded from the active scans. + */ public ApiResponse clearExcludedFromScan() throws ClientApiException { return api.callApi("ascan", "action", "clearExcludedFromScan", null); } + /** + * Adds a regex of URLs that should be excluded from the active scans. + */ public ApiResponse excludeFromScan(String regex) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); @@ -363,8 +420,18 @@ public ApiResponse setScannerAlertThreshold(String id, String alertthreshold, St } public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { + return addScanPolicy(scanpolicyname, null, null); + } + + public ApiResponse addScanPolicy(String scanpolicyname, String alertthreshold, String attackstrength) throws ClientApiException { Map map = new HashMap<>(); map.put("scanPolicyName", scanpolicyname); + if (alertthreshold != null) { + map.put("alertThreshold", alertthreshold); + } + if (attackstrength != null) { + map.put("attackStrength", attackstrength); + } return api.callApi("ascan", "action", "addScanPolicy", map); } @@ -374,6 +441,60 @@ public ApiResponse removeScanPolicy(String scanpolicyname) throws ClientApiExcep return api.callApi("ascan", "action", "removeScanPolicy", map); } + public ApiResponse updateScanPolicy(String scanpolicyname, String alertthreshold, String attackstrength) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanPolicyName", scanpolicyname); + if (alertthreshold != null) { + map.put("alertThreshold", alertthreshold); + } + if (attackstrength != null) { + map.put("attackStrength", attackstrength); + } + return api.callApi("ascan", "action", "updateScanPolicy", map); + } + + /** + * Adds a new parameter excluded from the scan, using the specified name. Optionally sets if the new entry applies to a specific URL (default, all URLs) and sets the ID of the type of the parameter (default, ID of any type). The type IDs can be obtained with the view excludedParamTypes. + */ + public ApiResponse addExcludedParam(String name, String type, String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + if (type != null) { + map.put("type", type); + } + if (url != null) { + map.put("url", url); + } + return api.callApi("ascan", "action", "addExcludedParam", map); + } + + /** + * Modifies a parameter excluded from the scan. Allows to modify the name, the URL and the type of parameter. The parameter is selected with its index, which can be obtained with the view excludedParams. + */ + public ApiResponse modifyExcludedParam(String idx, String name, String type, String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (name != null) { + map.put("name", name); + } + if (type != null) { + map.put("type", type); + } + if (url != null) { + map.put("url", url); + } + return api.callApi("ascan", "action", "modifyExcludedParam", map); + } + + /** + * Removes a parameter excluded from the scan, with the given index. The index can be obtained with the view excludedParams. + */ + public ApiResponse removeExcludedParam(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("ascan", "action", "removeExcludedParam", map); + } + public ApiResponse setOptionAttackPolicy(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -410,6 +531,9 @@ public ApiResponse setOptionHostPerScan(int i) throws ClientApiException { return api.callApi("ascan", "action", "setOptionHostPerScan", map); } + /** + * Sets whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, with the ID of the scanner that's sending the requests. + */ public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); @@ -428,6 +552,18 @@ public ApiResponse setOptionMaxResultsToList(int i) throws ClientApiException { return api.callApi("ascan", "action", "setOptionMaxResultsToList", map); } + public ApiResponse setOptionMaxRuleDurationInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxRuleDurationInMins", map); + } + + public ApiResponse setOptionMaxScanDurationInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxScanDurationInMins", map); + } + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index f59818d..925f7e6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -54,6 +54,34 @@ public ApiResponse isLatestVersion() throws ClientApiException { return api.callApi("autoupdate", "view", "isLatestVersion", null); } + /** + * Return a list of all of the installed add-ons + */ + public ApiResponse installedAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "installedAddons", null); + } + + /** + * Return a list of any add-ons that have been added to the Marketplace since the last check for updates + */ + public ApiResponse newAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "newAddons", null); + } + + /** + * Return a list of any add-ons that have been changed in the Marketplace since the last check for updates + */ + public ApiResponse updatedAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "updatedAddons", null); + } + + /** + * Return a list of all of the add-ons on the ZAP Marketplace (this information is read once and then cached) + */ + public ApiResponse marketplaceAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "marketplaceAddons", null); + } + public ApiResponse optionAddonDirectories() throws ClientApiException { return api.callApi("autoupdate", "view", "optionAddonDirectories", null); } @@ -113,6 +141,24 @@ public ApiResponse downloadLatestRelease() throws ClientApiException { return api.callApi("autoupdate", "action", "downloadLatestRelease", null); } + /** + * Installs or updates the specified add-on, returning when complete (ie not asynchronously) + */ + public ApiResponse installAddon(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("autoupdate", "action", "installAddon", map); + } + + /** + * Uninstalls the specified add-on + */ + public ApiResponse uninstallAddon(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("autoupdate", "action", "uninstallAddon", map); + } + public ApiResponse setOptionCheckAddonUpdates(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index c70b1ed..f995e5d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -40,14 +40,83 @@ public Break(ClientApi api) { this.api = api; } - public ApiResponse brk(String type, String scope, String state) throws ClientApiException { + /** + * Returns True if ZAP will break on both requests and responses + */ + public ApiResponse isBreakAll() throws ClientApiException { + return api.callApi("break", "view", "isBreakAll", null); + } + + /** + * Returns True if ZAP will break on requests + */ + public ApiResponse isBreakRequest() throws ClientApiException { + return api.callApi("break", "view", "isBreakRequest", null); + } + + /** + * Returns True if ZAP will break on responses + */ + public ApiResponse isBreakResponse() throws ClientApiException { + return api.callApi("break", "view", "isBreakResponse", null); + } + + /** + * Returns the HTTP message currently intercepted (if any) + */ + public ApiResponse httpMessage() throws ClientApiException { + return api.callApi("break", "view", "httpMessage", null); + } + + /** + * Controls the global break functionality. The type may be one of: http-all, http-request or http-response. The state may be true (for turning break on for the specified type) or false (for turning break off). Scope is not currently used. + */ + public ApiResponse brk(String type, String state, String scope) throws ClientApiException { Map map = new HashMap<>(); map.put("type", type); - map.put("scope", scope); map.put("state", state); + if (scope != null) { + map.put("scope", scope); + } return api.callApi("break", "action", "break", map); } + /** + * Overwrites the currently intercepted message with the data provided + */ + public ApiResponse setHttpMessage(String httpheader, String httpbody) throws ClientApiException { + Map map = new HashMap<>(); + map.put("httpHeader", httpheader); + if (httpbody != null) { + map.put("httpBody", httpbody); + } + return api.callApi("break", "action", "setHttpMessage", map); + } + + /** + * Submits the currently intercepted message and unsets the global request/response break points + */ + public ApiResponse cont() throws ClientApiException { + return api.callApi("break", "action", "continue", null); + } + + /** + * Submits the currently intercepted message, the next request or response will automatically be intercepted + */ + public ApiResponse step() throws ClientApiException { + return api.callApi("break", "action", "step", null); + } + + /** + * Drops the currently intercepted message + */ + public ApiResponse drop() throws ClientApiException { + return api.callApi("break", "action", "drop", null); + } + + /** + * Adds a custom HTTP breakpont. The string is the string to match. Location may be one of: url, request_header, request_body, response_header or response_body. Match may be: contains or regex. Inverse (match) may be true or false. Lastly, ignorecase (when matching the string) may be true or false. + */ public ApiResponse addHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { Map map = new HashMap<>(); map.put("string", string); @@ -58,6 +127,9 @@ public ApiResponse addHttpBreakpoint(String string, String location, String matc return api.callApi("break", "action", "addHttpBreakpoint", map); } + /** + * Removes the specified break point + */ public ApiResponse removeHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { Map map = new HashMap<>(); map.put("string", string); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 13b7e59..d07c87e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -160,10 +160,58 @@ public ApiResponse homeDirectory() throws ClientApiException { return api.callApi("core", "view", "homeDirectory", null); } + /** + * Gets the location of the current session file + */ + public ApiResponse sessionLocation() throws ClientApiException { + return api.callApi("core", "view", "sessionLocation", null); + } + + /** + * Gets all the domains that are excluded from the outgoing proxy. For each domain the following are shown: the index, the value (domain), if enabled, and if specified as a regex. + */ + public ApiResponse proxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "view", "proxyChainExcludedDomains", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyChainSkipName() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainSkipName", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyExcludedDomains() throws ClientApiException { + return api.callApi("core", "view", "optionProxyExcludedDomains", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException { + return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); + } + public ApiResponse optionDefaultUserAgent() throws ClientApiException { return api.callApi("core", "view", "optionDefaultUserAgent", null); } + /** + * Gets the TTL (in seconds) of successful DNS queries. + */ + public ApiResponse optionDnsTtlSuccessfulQueries() throws ClientApiException { + return api.callApi("core", "view", "optionDnsTtlSuccessfulQueries", null); + } + public ApiResponse optionHttpState() throws ClientApiException { return api.callApi("core", "view", "optionHttpState", null); } @@ -184,22 +232,10 @@ public ApiResponse optionProxyChainRealm() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainRealm", null); } - public ApiResponse optionProxyChainSkipName() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainSkipName", null); - } - public ApiResponse optionProxyChainUserName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainUserName", null); } - public ApiResponse optionProxyExcludedDomains() throws ClientApiException { - return api.callApi("core", "view", "optionProxyExcludedDomains", null); - } - - public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException { - return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); - } - public ApiResponse optionTimeoutInSecs() throws ClientApiException { return api.callApi("core", "view", "optionTimeoutInSecs", null); } @@ -282,10 +318,16 @@ public ApiResponse snapshotSession() throws ClientApiException { return api.callApi("core", "action", "snapshotSession", null); } + /** + * Clears the regexes of URLs excluded from the proxy. + */ public ApiResponse clearExcludedFromProxy() throws ClientApiException { return api.callApi("core", "action", "clearExcludedFromProxy", null); } + /** + * Adds a regex of URLs that should be excluded from the proxy. + */ public ApiResponse excludeFromProxy(String regex) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); @@ -307,12 +349,15 @@ public ApiResponse setMode(String mode) throws ClientApiException { return api.callApi("core", "action", "setMode", map); } + /** + * Generates a new Root CA certificate for the Local Proxy. + */ public ApiResponse generateRootCA() throws ClientApiException { return api.callApi("core", "action", "generateRootCA", null); } /** - * Sends the HTTP request, optionally following redirections. Returns the request sent and response received and followed redirections, if any. + * Sends the HTTP request, optionally following redirections. Returns the request sent and response received and followed redirections, if any. The Mode is enforced when sending the request (and following redirections), custom manual requests are not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. */ public ApiResponse sendRequest(String request, String followredirects) throws ClientApiException { Map map = new HashMap<>(); @@ -323,6 +368,9 @@ public ApiResponse sendRequest(String request, String followredirects) throws Cl return api.callApi("core", "action", "sendRequest", map); } + /** + * Deletes all alerts of the current session. + */ public ApiResponse deleteAllAlerts() throws ClientApiException { return api.callApi("core", "action", "deleteAllAlerts", null); } @@ -346,6 +394,62 @@ public ApiResponse deleteSiteNode(String url, String method, String postdata) th return api.callApi("core", "action", "deleteSiteNode", map); } + /** + * Adds a domain to be excluded from the outgoing proxy, using the specified value. Optionally sets if the new entry is enabled (default, true) and whether or not the new value is specified as a regex (default, false). + */ + public ApiResponse addProxyChainExcludedDomain(String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("value", value); + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("core", "action", "addProxyChainExcludedDomain", map); + } + + /** + * Modifies a domain excluded from the outgoing proxy. Allows to modify the value, if enabled or if a regex. The domain is selected with its index, which can be obtained with the view proxyChainExcludedDomains. + */ + public ApiResponse modifyProxyChainExcludedDomain(String idx, String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (value != null) { + map.put("value", value); + } + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("core", "action", "modifyProxyChainExcludedDomain", map); + } + + /** + * Removes a domain excluded from the outgoing proxy, with the given index. The index can be obtained with the view proxyChainExcludedDomains. + */ + public ApiResponse removeProxyChainExcludedDomain(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("core", "action", "removeProxyChainExcludedDomain", map); + } + + /** + * Enables all domains excluded from the outgoing proxy. + */ + public ApiResponse enableAllProxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "action", "enableAllProxyChainExcludedDomains", null); + } + + /** + * Disables all domains excluded from the outgoing proxy. + */ + public ApiResponse disableAllProxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "action", "disableAllProxyChainExcludedDomains", null); + } + public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -370,6 +474,11 @@ public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiExcep return api.callApi("core", "action", "setOptionProxyChainRealm", map); } + /** + * Use actions [add|modify|remove]ProxyChainExcludedDomain instead. + * @deprecated + */ + @Deprecated public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -382,6 +491,15 @@ public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiEx return api.callApi("core", "action", "setOptionProxyChainUserName", map); } + /** + * Sets the TTL (in seconds) of successful DNS queries (applies after ZAP restart). + */ + public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); + } + public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); @@ -428,6 +546,9 @@ public byte[] proxypac() throws ClientApiException { return api.callApiOther("core", "other", "proxy.pac", null); } + /** + * Gets the Root CA certificate of the Local Proxy. + */ public byte[] rootcert() throws ClientApiException { return api.callApiOther("core", "other", "rootcert", null); } @@ -452,6 +573,13 @@ public byte[] htmlreport() throws ClientApiException { return api.callApiOther("core", "other", "htmlreport", null); } + /** + * Generates a report in Markdown format + */ + public byte[] mdreport() throws ClientApiException { + return api.callApiOther("core", "other", "mdreport", null); + } + /** * Gets the message with the given ID in HAR format */ @@ -479,7 +607,7 @@ public byte[] messagesHar(String baseurl, String start, String count) throws Cli } /** - * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, the request sent and response received and followed redirections, if any. + * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, the request sent and response received and followed redirections, if any. The Mode is enforced when sending the request (and following redirections), custom manual requests are not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. */ public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index 07a0379..0430ea7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -41,7 +41,14 @@ public HttpSessions(ClientApi api) { } /** - * Gets the sessions of the given site. Optionally returning just the session with the given name. + * Gets all of the sites that have sessions. + */ + public ApiResponse sites() throws ClientApiException { + return api.callApi("httpSessions", "view", "sites", null); + } + + /** + * Gets the sessions for the given site. Optionally returning just the session with the given name. */ public ApiResponse sessions(String site, String session) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index 09f76b3..e27f145 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -40,6 +40,13 @@ public Pscan(ClientApi api) { this.api = api; } + /** + * Tells whether or not the passive scan should be performed only on messages that are in scope. + */ + public ApiResponse scanOnlyInScope() throws ClientApiException { + return api.callApi("pscan", "view", "scanOnlyInScope", null); + } + /** * The number of records the passive scanner still has to scan */ @@ -55,7 +62,7 @@ public ApiResponse scanners() throws ClientApiException { } /** - * Sets whether or not the passive scanning is enabled + * Sets whether or not the passive scanning is enabled (Note: the enabled state is not persisted). */ public ApiResponse setEnabled(String enabled) throws ClientApiException { Map map = new HashMap<>(); @@ -63,6 +70,15 @@ public ApiResponse setEnabled(String enabled) throws ClientApiException { return api.callApi("pscan", "action", "setEnabled", map); } + /** + * Sets whether or not the passive scan should be performed only on messages that are in scope. + */ + public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiException { + Map map = new HashMap<>(); + map.put("onlyInScope", onlyinscope); + return api.callApi("pscan", "action", "setScanOnlyInScope", map); + } + /** * Enables all passive scanners */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 691256a..1ce8a52 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -66,14 +66,41 @@ public ApiResponse scans() throws ClientApiException { return api.callApi("spider", "view", "scans", null); } + /** + * Gets the regexes of URLs excluded from the spider scans. + */ public ApiResponse excludedFromScan() throws ClientApiException { return api.callApi("spider", "view", "excludedFromScan", null); } + /** + * Returns a list of unique URLs from the history table based on HTTP messages added by the Spider. + */ + public ApiResponse allUrls() throws ClientApiException { + return api.callApi("spider", "view", "allUrls", null); + } + + /** + * Gets all the domains that are always in scope. For each domain the following are shown: the index, the value (domain), if enabled, and if specified as a regex. + */ + public ApiResponse domainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "view", "domainsAlwaysInScope", null); + } + + /** + * Use view domainsAlwaysInScope instead. + * @deprecated + */ + @Deprecated public ApiResponse optionDomainsAlwaysInScope() throws ClientApiException { return api.callApi("spider", "view", "optionDomainsAlwaysInScope", null); } + /** + * Use view domainsAlwaysInScope instead. + * @deprecated + */ + @Deprecated public ApiResponse optionDomainsAlwaysInScopeEnabled() throws ClientApiException { return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", null); } @@ -82,6 +109,13 @@ public ApiResponse optionHandleParameters() throws ClientApiException { return api.callApi("spider", "view", "optionHandleParameters", null); } + /** + * Gets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. + */ + public ApiResponse optionMaxChildren() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxChildren", null); + } + public ApiResponse optionMaxDepth() throws ClientApiException { return api.callApi("spider", "view", "optionMaxDepth", null); } @@ -98,10 +132,12 @@ public ApiResponse optionRequestWaitTime() throws ClientApiException { return api.callApi("spider", "view", "optionRequestWaitTime", null); } + @Deprecated public ApiResponse optionScope() throws ClientApiException { return api.callApi("spider", "view", "optionScope", null); } + @Deprecated public ApiResponse optionScopeText() throws ClientApiException { return api.callApi("spider", "view", "optionScopeText", null); } @@ -151,7 +187,7 @@ public ApiResponse optionProcessForm() throws ClientApiException { } /** - * Sets whether or not the 'Referer' header should be sent while spidering + * Gets whether or not the 'Referer' header should be sent while spidering. */ public ApiResponse optionSendRefererHeader() throws ClientApiException { return api.callApi("spider", "view", "optionSendRefererHeader", null); @@ -248,22 +284,89 @@ public ApiResponse removeAllScans() throws ClientApiException { return api.callApi("spider", "action", "removeAllScans", null); } + /** + * Clears the regexes of URLs excluded from the spider scans. + */ public ApiResponse clearExcludedFromScan() throws ClientApiException { return api.callApi("spider", "action", "clearExcludedFromScan", null); } + /** + * Adds a regex of URLs that should be excluded from the spider scans. + */ public ApiResponse excludeFromScan(String regex) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); return api.callApi("spider", "action", "excludeFromScan", map); } + /** + * Adds a new domain that's always in scope, using the specified value. Optionally sets if the new entry is enabled (default, true) and whether or not the new value is specified as a regex (default, false). + */ + public ApiResponse addDomainAlwaysInScope(String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("value", value); + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("spider", "action", "addDomainAlwaysInScope", map); + } + + /** + * Modifies a domain that's always in scope. Allows to modify the value, if enabled or if a regex. The domain is selected with its index, which can be obtained with the view domainsAlwaysInScope. + */ + public ApiResponse modifyDomainAlwaysInScope(String idx, String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (value != null) { + map.put("value", value); + } + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("spider", "action", "modifyDomainAlwaysInScope", map); + } + + /** + * Removes a domain that's always in scope, with the given index. The index can be obtained with the view domainsAlwaysInScope. + */ + public ApiResponse removeDomainAlwaysInScope(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("spider", "action", "removeDomainAlwaysInScope", map); + } + + /** + * Enables all domains that are always in scope. + */ + public ApiResponse enableAllDomainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "action", "enableAllDomainsAlwaysInScope", null); + } + + /** + * Disables all domains that are always in scope. + */ + public ApiResponse disableAllDomainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "action", "disableAllDomainsAlwaysInScope", null); + } + public ApiResponse setOptionHandleParameters(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionHandleParameters", map); } + /** + * Use actions [add|modify|remove]DomainAlwaysInScope instead. + * @deprecated + */ + @Deprecated public ApiResponse setOptionScopeString(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -288,6 +391,15 @@ public ApiResponse setOptionHandleODataParametersVisited(boolean bool) throws Cl return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); } + /** + * Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. + */ + public ApiResponse setOptionMaxChildren(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxChildren", map); + } + public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); @@ -354,6 +466,9 @@ public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { return api.callApi("spider", "action", "setOptionRequestWaitTime", map); } + /** + * Sets whether or not the 'Referer' header should be sent while spidering. + */ public ApiResponse setOptionSendRefererHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); From 90341aca8c57252628afd3985f05987582fcd5e8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 28 Mar 2017 08:49:59 +0100 Subject: [PATCH 021/148] Add change log Add a file with the changes done to the versions, easier to track the changes and build the release notes of each version. --- CHANGES.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 CHANGES.md diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..8f035e2 --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,44 @@ +# Change Log + +Summary of the changes done in each version. + +## 1.2.0-SNAPSHOT (Not yet released) + +### Updated APIs + + - Core APIs updated for ZAP version 2.6.0. + - AJAX Spider API + - Allows to obtain the full results of a scan, messages in/out of scope and message with I/O errors. + +## 1.1.1 (2017-03-09) + +### Bug Fixes + - Fixed a bug that prevented the new API methods (that don't require the API key) from being used with ZAP versions <= 2.5.0. + +## 1.1.0 (2017-03-09) + +### Enhancements + - The `ClientApi` now allows to set the API key through the constructor, which ensures that the API key is sent whenever required. The API methods that allowed to pass the API key were deprecated in favour of using the new constructor. + - It's now possible to specify the API key in all Ant tasks. + - It's now possible to obtain the keys of the values of an `ApiResponseSet` (also, deprecated unused/unnecessary constructor and method). + - The `Alert` now exposes the alert ID, message ID and scanner ID. + - Added confidence "False Positive" (enum `Alert.Confidence`). + - `Alert` and `AlertTask` now use `name` instead of `alert` for the name of the alert (zaproxy/zaproxy#1341), older methods were deprecated. + +### Bug Fixes + - `ApiResponseSet` now has as values `ApiResponse` (zaproxy/zaproxy#3228). + +### New APIs + + - Context Alert Filters API, for more information refer to the help page: https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAlertFiltersAlertFilter + +### Updated APIs + + - AJAX Spider API + - Allows to scan a context, as a user and just a subtree. + - Selenium API + - Allows to choose which Firefox binary is used and set the path to geckodriver. + +## 1.0.0 (2016-06-03) + +First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. From 2e2c56e7fa3a9b706714d3100fe67bb6ff48ce17 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 28 Mar 2017 22:18:27 +0100 Subject: [PATCH 022/148] Add badges to README.md Add badges to show the latest released version (Maven Central), license and build status. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ffc940a..b21be37 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # OWASP ZAP Java API +[![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) +[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +[![Build Status](https://api.travis-ci.org/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.org/zaproxy/zap-api-java) + The Java implementation to access the [OWASP ZAP API](https://github.com/zaproxy/zaproxy/wiki/ApiDetails). For more information about OWASP ZAP consult the (main) [OWASP ZAP project](https://github.com/zaproxy/zaproxy/). From 5b0a9a340f9dd06e104fd9e03d3a2aecb80aaf13 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 29 Mar 2017 11:43:44 +0100 Subject: [PATCH 023/148] Bump version number to 1.2.0 --- CHANGES.md | 2 +- README.md | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 8f035e2..d1d79e9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ Summary of the changes done in each version. -## 1.2.0-SNAPSHOT (Not yet released) +## 1.2.0 (2017-03-29) ### Updated APIs diff --git a/README.md b/README.md index ffc940a..a3739bf 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.1.1` + * Version: `1.2.0` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). diff --git a/build.gradle b/build.gradle index d79b6d8..f17df3f 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.2.0-SNAPSHOT' + version '1.2.0' ext.versionBC = '1.0.0' repositories { From 698b11cdf4c904885b22007f6f0bb6a2b1629734 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 29 Mar 2017 11:48:37 +0100 Subject: [PATCH 024/148] Bump version number to 1.3.0-SNAPSHOT --- CHANGES.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index d1d79e9..2b93f84 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ Summary of the changes done in each version. +## 1.3.0-SNAPSHOT (Not yet released) + ## 1.2.0 (2017-03-29) ### Updated APIs diff --git a/build.gradle b/build.gradle index f17df3f..09d011a 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.2.0' + version '1.3.0-SNAPSHOT' ext.versionBC = '1.0.0' repositories { From 7114808c596e564276edc513b608e0f4c7c7b4f6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 29 Mar 2017 21:54:33 +0100 Subject: [PATCH 025/148] Fix typo in README Remove repeated word ("the the"). --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b62777e..a599943 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Checkout the tagged version: git checkout v -Create the the artifacts/libraries necessary for the release: +Create the artifacts/libraries necessary for the release: ./gradlew clean build uberJar From dff6f3dd06bc49e3a31248afff2319889c6160c3 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 12 May 2017 22:56:23 +0100 Subject: [PATCH 026/148] Add Importurls API Add the API of the add-on "Import files containing URLs" (version 3). --- CHANGES.md | 4 ++ .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/Importurls.java | 51 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java diff --git a/CHANGES.md b/CHANGES.md index 2b93f84..065e857 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,10 @@ Summary of the changes done in each version. ## 1.3.0-SNAPSHOT (Not yet released) +### New APIs + + - Import files containing URLs ("importurls"). + ## 1.2.0 (2017-03-29) ### Updated APIs diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 985dfde..605ca13 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -60,6 +60,7 @@ import org.zaproxy.clientapi.gen.ForcedUser; import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.ImportLogFiles; +import org.zaproxy.clientapi.gen.Importurls; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; import org.zaproxy.clientapi.gen.Pscan; @@ -102,6 +103,7 @@ public class ClientApi { public ForcedUser forcedUser = new ForcedUser(this); public HttpSessions httpSessions = new HttpSessions(this); public ImportLogFiles logImportFiles = new ImportLogFiles(this); + public Importurls importurls = new Importurls(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); public Pscan pscan = new Pscan(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java new file mode 100644 index 0000000..3a3c977 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -0,0 +1,51 @@ +/* Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2016 the ZAP development team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + + +/** + * This file was automatically generated. + */ +@SuppressWarnings("javadoc") +public class Importurls { + + private final ClientApi api; + + public Importurls(ClientApi api) { + this.api = api; + } + + /** + * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importurls(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("importurls", "action", "importurls", map); + } + +} From 1b1f9a5747d243ad6f1af801882a481e236ee160 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 12 May 2017 23:11:23 +0100 Subject: [PATCH 027/148] Add Openapi API Add the API of the add-on "OpenAPI Support" (version 5). --- CHANGES.md | 1 + .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/Openapi.java | 64 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java diff --git a/CHANGES.md b/CHANGES.md index 065e857..1b76d50 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ Summary of the changes done in each version. ### New APIs - Import files containing URLs ("importurls"). + - OpenAPI Support ("openapi"). ## 1.2.0 (2017-03-29) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 605ca13..b574672 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -61,6 +61,7 @@ import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.ImportLogFiles; import org.zaproxy.clientapi.gen.Importurls; +import org.zaproxy.clientapi.gen.Openapi; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; import org.zaproxy.clientapi.gen.Pscan; @@ -104,6 +105,7 @@ public class ClientApi { public HttpSessions httpSessions = new HttpSessions(this); public ImportLogFiles logImportFiles = new ImportLogFiles(this); public Importurls importurls = new Importurls(this); + public Openapi openapi = new Openapi(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); public Pscan pscan = new Pscan(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java new file mode 100644 index 0000000..eca96fa --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -0,0 +1,64 @@ +/* Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2016 the ZAP development team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + + +/** + * This file was automatically generated. + */ +@SuppressWarnings("javadoc") +public class Openapi { + + private final ClientApi api; + + public Openapi(ClientApi api) { + this.api = api; + } + + /** + * Import an Open API definition from a local file. + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + return api.callApi("openapi", "action", "importFile", map); + } + + /** + * Import an Open API definition from a URL. + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + return api.callApi("openapi", "action", "importUrl", map); + } + +} From 1207bae061a8455341e6ce5e1cf953631997a25b Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 1 Jun 2017 22:49:56 +0100 Subject: [PATCH 028/148] Regenerate Openapi API Regenerate the API of the add-on "OpenAPI Support" (upcoming version 6). --- .../src/main/java/org/zaproxy/clientapi/gen/Openapi.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index eca96fa..d04a6aa 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -51,13 +51,16 @@ public ApiResponse importFile(String file) throws ClientApiException { } /** - * Import an Open API definition from a URL. + * Import an Open API definition from a URL, hostOverride allows the host to be replaced *

* This component is optional and therefore the API will only work if it is installed */ - public ApiResponse importUrl(String url) throws ClientApiException { + public ApiResponse importUrl(String url, String hostoverride) throws ClientApiException { Map map = new HashMap<>(); map.put("url", url); + if (hostoverride != null) { + map.put("hostOverride", hostoverride); + } return api.callApi("openapi", "action", "importUrl", map); } From d53f80eeeeb435327fdeb2299f5275b0875c3d94 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 21 Jun 2017 21:35:35 +0100 Subject: [PATCH 029/148] Update Ant tasks to wait for the scans to finish Change ActiveScanSubtreeTask, ActiveScanUrlTask, and SpiderUrlTask to wait for the scans to finish before returning. Refactor the active scan tasks to reduce code duplication (they differ only on the parameters used to start the scan). Update the tests to assert the new behaviour (i.e. scan tasks check the status of the scans). --- CHANGES.md | 4 ++ .../clientapi/ant/AbstractActiveScanTask.java | 56 +++++++++++++++++++ .../clientapi/ant/ActiveScanSubtreeTask.java | 25 ++------- .../clientapi/ant/ActiveScanUrlTask.java | 24 ++------ .../zaproxy/clientapi/ant/SpiderUrlTask.java | 8 ++- .../org/zaproxy/clientapi/ant/ZapTask.java | 9 +++ .../org/zaproxy/clientapi/ant/BuildTest.java | 30 +++++++++- 7 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java diff --git a/CHANGES.md b/CHANGES.md index 1b76d50..d76dcce 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,10 @@ Summary of the changes done in each version. - Import files containing URLs ("importurls"). - OpenAPI Support ("openapi"). +### Ant Tasks + + - Update scan tasks to wait for the corresponding scan to finish. + ## 1.2.0 (2017-03-29) ### Updated APIs diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java new file mode 100644 index 0000000..010d4f1 --- /dev/null +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java @@ -0,0 +1,56 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApiException; + +public abstract class AbstractActiveScanTask extends ZapTask { + + private String url; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public void execute() throws BuildException { + try { + waitForActiveScan(extractValue(startScan())); + } catch (Exception e) { + throw new BuildException(e); + } + } + + protected abstract ApiResponse startScan() throws ClientApiException; + + private void waitForActiveScan(String scanId) throws ClientApiException, InterruptedException { + int progress; + do { + progress = Integer.parseInt(extractValue(getClientApi().ascan.status(scanId))); + Thread.sleep(1000); + } while (progress < 100); + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java index 977db08..461e242 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java @@ -19,27 +19,14 @@ */ package org.zaproxy.clientapi.ant; -import org.apache.tools.ant.BuildException; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApiException; -public class ActiveScanSubtreeTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().ascan.scan(url, "true", "false", "", "", ""); - - } catch (Exception e) { - throw new BuildException(e); - } - } +public class ActiveScanSubtreeTask extends AbstractActiveScanTask { - public String getUrl() { - return url; + @Override + protected ApiResponse startScan() throws ClientApiException { + return this.getClientApi().ascan.scan(getUrl(), "true", "false", "", "", ""); } - public void setUrl(String url) { - this.url = url; - } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index cf8fa92..ff12fc6 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -19,27 +19,13 @@ */ package org.zaproxy.clientapi.ant; -import org.apache.tools.ant.BuildException; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApiException; -public class ActiveScanUrlTask extends ZapTask { - - private String url; +public class ActiveScanUrlTask extends AbstractActiveScanTask { @Override - public void execute() throws BuildException { - try { - this.getClientApi().ascan.scan(url, "false", "false", "", "", ""); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; + protected ApiResponse startScan() throws ClientApiException { + return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 6d861fb..5fbf3bd 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -28,7 +28,13 @@ public class SpiderUrlTask extends ZapTask { @Override public void execute() throws BuildException { try { - this.getClientApi().spider.scan(url, "", "", null, null); + String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); + + int progress; + do { + progress = Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); + Thread.sleep(1000); + } while (progress < 100); } catch (Exception e) { throw new BuildException(e); diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java index 80f881d..32378bb 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java @@ -20,6 +20,8 @@ package org.zaproxy.clientapi.ant; import org.apache.tools.ant.Task; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ApiResponseElement; import org.zaproxy.clientapi.core.ClientApi; public abstract class ZapTask extends Task { @@ -60,4 +62,11 @@ public String getApikey() { public void setApikey(String apikey) { this.apikey = apikey; } + + protected String extractValue(ApiResponse element) { + if (element instanceof ApiResponseElement) { + return ((ApiResponseElement) element).getValue(); + } + return null; + } } diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java index 14117cf..041724e 100644 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -22,6 +22,8 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildFileRule; @@ -60,6 +62,8 @@ public static void setUp() throws IOException { @Before public void setUpBuildFile() { + zap.clearResponses(); + buildRule.configureProject(BUILD_FILE_PATH); // Properties used in build.xml file @@ -88,11 +92,15 @@ public void shouldExecuteTargetAccessUrl() { @Test public void shouldExecuteTargetActiveScanSubtree() { + zap.addResponse("http://zap/xml/ascan/action/scan/", "0"); + zap.addResponse("http://zap/xml/ascan/view/status/", "100"); buildRule.executeTarget("activeScanSubtree"); } @Test public void shouldExecuteTargetActiveScanUrl() { + zap.addResponse("http://zap/xml/ascan/action/scan/", "0"); + zap.addResponse("http://zap/xml/ascan/view/status/", "100"); buildRule.executeTarget("activeScanUrl"); } @@ -123,6 +131,8 @@ public void shouldExecuteTargetSaveSession() { @Test public void shouldExecuteTargetSpider() { + zap.addResponse("http://zap/xml/spider/action/scan/", "0"); + zap.addResponse("http://zap/xml/spider/view/status/", "100"); buildRule.executeTarget("spider"); } @@ -134,18 +144,32 @@ public void shouldExecuteTargetStopZap() { private static class SimpleServer extends NanoHTTPD { private final String mimeType; - private final String response; + private final String defaultResponse; + private final Map pathResponses; - public SimpleServer(String mimeType, String response) throws IOException { + public SimpleServer(String mimeType, String defaultResponse) throws IOException { super(0); start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); this.mimeType = mimeType; - this.response = response; + this.defaultResponse = defaultResponse; + this.pathResponses = new HashMap<>(); + } + + public void addResponse(String path, String string) { + pathResponses.put(path, string); + } + + public void clearResponses() { + pathResponses.clear(); } @Override public Response serve(IHTTPSession session) { + String response = pathResponses.get(session.getUri()); + if (response == null) { + response = defaultResponse; + } return new Response(Response.Status.OK, mimeType, new StringInputStream(response), response.length()) { // Extend to access the constructor. }; From 86b405126bc16434f670099460194e26bc849373 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 22 Jun 2017 23:54:49 +0100 Subject: [PATCH 030/148] Add replacer API Add the API of the add-on Replacer (to be released). --- CHANGES.md | 1 + .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/Replacer.java | 93 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java diff --git a/CHANGES.md b/CHANGES.md index d76dcce..90ea1d9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Summary of the changes done in each version. - Import files containing URLs ("importurls"). - OpenAPI Support ("openapi"). + - Replacer ("replacer"). ### Ant Tasks diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index b574672..4b2862b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -65,6 +65,7 @@ import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; import org.zaproxy.clientapi.gen.Pscan; +import org.zaproxy.clientapi.gen.Replacer; import org.zaproxy.clientapi.gen.Reveal; import org.zaproxy.clientapi.gen.Script; import org.zaproxy.clientapi.gen.Search; @@ -109,6 +110,7 @@ public class ClientApi { public Params params = new Params(this); public Pnh pnh = new Pnh(this); public Pscan pscan = new Pscan(this); + public Replacer replacer = new Replacer(this); public Reveal reveal = new Reveal(this); public Search search = new Search(this); public Script script = new Script(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java new file mode 100644 index 0000000..b4d71db --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -0,0 +1,93 @@ +/* Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 the ZAP development team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + + +/** + * This file was automatically generated. + */ +@SuppressWarnings("javadoc") +public class Replacer { + + private final ClientApi api; + + public Replacer(ClientApi api) { + this.api = api; + } + + /** + * Returns full details of all of the rules + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse rules() throws ClientApiException { + return api.callApi("replacer", "view", "rules", null); + } + + /** + * Adds a replacer rule. For the parameters: desc is a user friendly description, enabled is true or false, matchType is one of [REQ_HEADER, REQ_HEADER_STR, REQ_BODY_STR, RESP_HEADER, RESP_HEADER_STR, RESP_BODY_STR], matchRegex should be true if the matchString should be treated as a regex otherwise false, matchString is the string that will be matched against, replacement is the replacement string, initiators may be blank (for all initiators) or a comma separated list of integers as defined in HttpSender + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addRule(String description, String enabled, String matchtype, String matchregex, String matchstring, String replacement, String initiators) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("enabled", enabled); + map.put("matchType", matchtype); + map.put("matchRegex", matchregex); + map.put("matchString", matchstring); + map.put("replacement", replacement); + if (initiators != null) { + map.put("initiators", initiators); + } + return api.callApi("replacer", "action", "addRule", map); + } + + /** + * Removes the rule with the given description + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeRule(String description) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + return api.callApi("replacer", "action", "removeRule", map); + } + + /** + * Enables or disables the rule with the given description based on the bool parameter + *

+ * This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setEnabled(String description, String bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("bool", bool); + return api.callApi("replacer", "action", "setEnabled", map); + } + +} From e1f90b1bd217258a2866d481d82d10537bec4972 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 23 Jun 2017 16:21:17 +0100 Subject: [PATCH 031/148] Bump version number to 1.3.0 --- CHANGES.md | 2 +- README.md | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 90ea1d9..b23209c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ Summary of the changes done in each version. -## 1.3.0-SNAPSHOT (Not yet released) +## 1.3.0 (2017-06-23) ### New APIs diff --git a/README.md b/README.md index a599943..a263a94 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.2.0` + * Version: `1.3.0` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). diff --git a/build.gradle b/build.gradle index 09d011a..b3e03b2 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.3.0-SNAPSHOT' + version '1.3.0' ext.versionBC = '1.0.0' repositories { From 45d2e2debc7938eb094ef7e6eef2a5594bcde53a Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 23 Jun 2017 16:26:24 +0100 Subject: [PATCH 032/148] Bump version number to 1.4.0-SNAPSHOT --- CHANGES.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index b23209c..73175d7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ Summary of the changes done in each version. +## 1.4.0-SNAPSHOT (Not yet released) + ## 1.3.0 (2017-06-23) ### New APIs diff --git a/build.gradle b/build.gradle index b3e03b2..ed40252 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ allprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.3.0' + version '1.4.0-SNAPSHOT' ext.versionBC = '1.0.0' repositories { From feee7751ff0b673919ca46685b4c1f79dcfe2712 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 30 Jun 2017 16:07:41 +0100 Subject: [PATCH 033/148] Add an Ant task to create ZAP reports Add a new task, ReportTask, that allows to create the ZAP report. Add test to check that the new Ant task is called. Fix zaproxy/zaproxy#3712 - Allow to create reports with Ant tasks --- CHANGES.md | 16 +++ .../org/zaproxy/clientapi/ant/ReportTask.java | 129 ++++++++++++++++++ .../org/zaproxy/clientapi/ant/BuildTest.java | 31 ++++- .../org/zaproxy/clientapi/ant/build.xml | 6 + 4 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java diff --git a/CHANGES.md b/CHANGES.md index 73175d7..4b095db 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,22 @@ Summary of the changes done in each version. ## 1.4.0-SNAPSHOT (Not yet released) +### Ant Tasks + + - New task to create ZAP reports: + ```XML + + + + + + ``` + ## 1.3.0 (2017-06-23) ### New APIs diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java new file mode 100644 index 0000000..38d8622 --- /dev/null +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java @@ -0,0 +1,129 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2017 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import org.apache.tools.ant.BuildException; + +public class ReportTask extends ZapTask { + + private static final String HTML_REPORT_TYPE = "html"; + private static final String MD_REPORT_TYPE = "md"; + private static final String XML_REPORT_TYPE = "xml"; + private static final String DEFAULT_REPORT_TYPE = HTML_REPORT_TYPE; + + private static final List SUPPORTED_REPORT_TYPES = Arrays.asList(HTML_REPORT_TYPE, MD_REPORT_TYPE, XML_REPORT_TYPE); + + private String type = DEFAULT_REPORT_TYPE; + private File file; + private boolean overwrite; + + public void setType(String type) { + this.type = type; + } + + public void setFile(String file) { + this.file = new File(file); + if (!this.file.isAbsolute()) { + this.file = new File(getProject().getBaseDir(), file); + } + } + + public void setOverwrite(boolean overwrite) { + this.overwrite = overwrite; + } + + @Override + public void execute() throws BuildException { + validateTaskAttributes(); + + byte[] reportContents; + try { + switch (type.toLowerCase()) { + case MD_REPORT_TYPE: + reportContents = this.getClientApi().core.mdreport(); + break; + case XML_REPORT_TYPE: + reportContents = this.getClientApi().core.xmlreport(); + break; + case HTML_REPORT_TYPE: + default: + reportContents = this.getClientApi().core.htmlreport(); + break; + } + } catch (Exception e) { + throw new BuildException("Failed to obtain the report from ZAP: " + e.getMessage(), e); + } + + try (OutputStream os = Files.newOutputStream(file.toPath())) { + os.write(reportContents); + } catch (IOException e) { + throw new BuildException("Failed to save the report: " + e.getMessage(), e); + } + + } + + private void validateTaskAttributes() { + if (type == null || type.isEmpty()) { + type = DEFAULT_REPORT_TYPE; + } else { + type = type.toLowerCase(Locale.ROOT); + if (!SUPPORTED_REPORT_TYPES.contains(type)) { + throw new BuildException("Unknown report type [" + type + "], supported types: " + SUPPORTED_REPORT_TYPES); + } + } + + if (file == null) { + throw new BuildException("The 'file' attribute must be provided."); + } + + if (file.isFile()) { + if (!file.canWrite()) { + throw new BuildException("The provided file is not writable: " + file.getAbsolutePath()); + } + + if (!overwrite) { + throw new BuildException( + "The file already exists but 'overwrite' attribute is not set to 'true': " + file.getAbsolutePath()); + } + } else if (!file.exists()) { + File dir = file.getParentFile(); + if (dir == null) { + throw new BuildException( + "Unable to determine parent directory of the file provided: " + file.getAbsolutePath()); + } + + dir.mkdirs(); + if (!dir.canWrite()) { + throw new BuildException("The provided directory does not exist or is not writable: " + dir.getAbsolutePath()); + } + } else { + throw new BuildException("The 'file' attribute does not specify a file: " + file.getAbsolutePath()); + } + } + +} diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java index 041724e..7a03a5f 100644 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -21,7 +21,10 @@ import static org.junit.Assert.assertTrue; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.util.HashMap; import java.util.Map; @@ -33,6 +36,7 @@ import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.zaproxy.clientapi.core.ClientApiException; import fi.iki.elonen.NanoHTTPD; @@ -43,11 +47,14 @@ public class BuildTest { private static final String BUILD_FILE_NAME = "build.xml"; - private static final String BUILD_FILE_PATH = BuildTest.class.getResource(BUILD_FILE_NAME).toString().replace("file:", ""); + private static final String REPORT_PATH = "report.html"; private static SimpleServer zap; private static SimpleServer targetSite; + @Rule + public final TemporaryFolder buildDir = new TemporaryFolder(); + @Rule public final BuildFileRule buildRule = new BuildFileRule(); @@ -64,7 +71,18 @@ public static void setUp() throws IOException { public void setUpBuildFile() { zap.clearResponses(); - buildRule.configureProject(BUILD_FILE_PATH); + File buildFile = new File(buildDir.getRoot(), BUILD_FILE_NAME); + if (!buildFile.exists()) { + try { + try (InputStream is = BuildTest.class.getResourceAsStream(BUILD_FILE_NAME)) { + Files.copy(is, buildFile.toPath()); + } + } catch (IOException e) { + throw new RuntimeException("Failed to set up the test:", e); + } + } + + buildRule.configureProject(buildFile.getAbsolutePath()); // Properties used in build.xml file buildRule.getProject().setProperty("zap.addr", "localhost"); @@ -72,6 +90,9 @@ public void setUpBuildFile() { buildRule.getProject().setProperty("zap.key", "API_KEY"); buildRule.getProject().setProperty("zap.targetUrl", "http://localhost:" + targetSite.getListeningPort()); buildRule.getProject().setProperty("zap.session", "session"); + buildRule.getProject().setProperty("zap.report.path", REPORT_PATH); + buildRule.getProject().setProperty("zap.report.type", "html"); + buildRule.getProject().setProperty("zap.report.overwrite", "false"); } @AfterClass @@ -141,6 +162,12 @@ public void shouldExecuteTargetStopZap() { buildRule.executeTarget("stopZap"); } + @Test + public void shouldExecuteReport() { + buildRule.executeTarget("report"); + assertTrue("Report file not created.", new File(buildDir.getRoot(), REPORT_PATH).exists()); + } + private static class SimpleServer extends NanoHTTPD { private final String mimeType; diff --git a/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml b/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml index 4eb105c..ffcabd1 100644 --- a/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml +++ b/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml @@ -10,6 +10,7 @@ + @@ -58,4 +59,9 @@ + + + + From c37605063762d3c79d81411b177f3f8fc621daa7 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 30 Jun 2017 22:48:55 +0100 Subject: [PATCH 034/148] Build tweaks and Gradle update Update Gradle wrapper to latest version (4.0). Apply Java plugin (and other properties) to just the subprojects. Use constants for Java version. Execute uberJar task automatically when building and update the README to reflect the change. Allow to generate the POM file and install it to local Maven repository. --- README.md | 2 +- build.gradle | 8 +- gradle/wrapper/gradle-wrapper.jar | Bin 52818 -> 54706 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 23 ++-- .../zap-clientapi/zap-clientapi.gradle | 111 ++++++++++-------- 6 files changed, 83 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index a263a94..0079feb 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ Checkout the tagged version: Create the artifacts/libraries necessary for the release: - ./gradlew clean build uberJar + ./gradlew clean build ### Release to Maven Central diff --git a/build.gradle b/build.gradle index ed40252..8c54a7c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,12 @@ task wrapper(type: Wrapper) { - gradleVersion = '3.2.1' + gradleVersion = '4.0' } apply from: "gradle/compile.gradle" apply from: "gradle/idea.gradle" apply from: "gradle/eclipse.gradle" -allprojects { +subprojects { apply plugin: 'java' group = 'org.zaproxy' @@ -18,6 +18,6 @@ allprojects { mavenCentral() } - sourceCompatibility = 1.7 - targetCompatibility = 1.7 + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index deedc7fa5e6310eac3148a7dd0b1f069b07364cb..e894adac2635380847ce7e51449df6bcada98645 100644 GIT binary patch delta 24248 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 G;{O0{Smg2m diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5f405a9..3350b20 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.2.1-bin.zip -distributionSha256Sum=9843a3654d3e57dce54db06d05f18b664b95c22bf90c6becccb61fc63ce60689 \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-bin.zip +distributionSha256Sum=56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe \ No newline at end of file diff --git a/gradlew b/gradlew index 9aa616c..cccdd3d 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -154,16 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 06f0769..f6a7211 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -53,6 +53,8 @@ task uberJar(type: Jar) { with jar } +build.dependsOn 'uberJar' + artifacts { archives sourcesJar, javadocJar } signing { @@ -61,6 +63,66 @@ signing { } } +ext.pomData = pom { + project { + name 'OWASP ZAP API Client' + packaging 'jar' + description 'Java implementation to access OWASP ZAP API.' + url 'https://github.com/zaproxy/zap-api-java' + + organization { + name 'OWASP' + url 'https://www.owasp.org/index.php/ZAP' + } + + mailingLists { + mailingList { + name 'OWASP ZAP User Group' + post 'zaproxy-users@googlegroups.com' + archive 'https://groups.google.com/group/zaproxy-users' + } + mailingList { + name 'OWASP ZAP Developer Group' + post 'zaproxy-develop@googlegroups.com' + archive 'https://groups.google.com/group/zaproxy-develop' + } + } + + scm { + url 'https://github.com/zaproxy/zap-api-java' + connection 'scm:git:https://github.com/zaproxy/zap-api-java.git' + developerConnection 'scm:git:https://github.com/zaproxy/zap-api-java.git' + } + + licenses { + license { + name 'The Apache License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + + developers { + developer { + id 'psiinon' + name 'Simon Bennetts' + email 'psiinon@gmail.com' + } + } + } +} + +task generatePom { + description 'Generates the POM file.' + pomData.writeTo("$buildDir/pom.xml") +} + +install { + repositories.mavenInstaller { + pom = pomData + } +} + uploadArchives { repositories { mavenDeployer { @@ -80,54 +142,7 @@ uploadArchives { } } - pom { - project { - name 'OWASP ZAP API Client' - packaging 'jar' - description 'Java implementation to access OWASP ZAP API.' - url 'https://github.com/zaproxy/zap-api-java' - - organization { - name 'OWASP' - url 'https://www.owasp.org/index.php/ZAP' - } - - mailingLists { - mailingList { - name 'OWASP ZAP User Group' - post 'zaproxy-users@googlegroups.com' - archive 'https://groups.google.com/group/zaproxy-users' - } - mailingList { - name 'OWASP ZAP Developer Group' - post 'zaproxy-develop@googlegroups.com' - archive 'https://groups.google.com/group/zaproxy-develop' - } - } - - scm { - url 'https://github.com/zaproxy/zap-api-java' - connection 'scm:git:https://github.com/zaproxy/zap-api-java.git' - developerConnection 'scm:git:https://github.com/zaproxy/zap-api-java.git' - } - - licenses { - license { - name 'The Apache License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - - developers { - developer { - id 'psiinon' - name 'Simon Bennetts' - email 'psiinon@gmail.com' - } - } - } - } + pom = pomData } } } \ No newline at end of file From 4bb3076f4201f1c4fff32be69a1c4af5358f5e50 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jul 2017 10:39:23 +0100 Subject: [PATCH 035/148] Bump version number to 1.4.0 --- CHANGES.md | 2 +- README.md | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4b095db..2422c81 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ Summary of the changes done in each version. -## 1.4.0-SNAPSHOT (Not yet released) +## 1.4.0 (2017-07-13) ### Ant Tasks diff --git a/README.md b/README.md index 0079feb..bccfa58 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.3.0` + * Version: `1.4.0` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). diff --git a/build.gradle b/build.gradle index 8c54a7c..e5e0859 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ subprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.4.0-SNAPSHOT' + version '1.4.0' ext.versionBC = '1.0.0' repositories { From 4f1abaf73826726aadabd1d34a49681f55bba502 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jul 2017 10:43:52 +0100 Subject: [PATCH 036/148] Bump version number to 1.5.0-SNAPSHOT --- CHANGES.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 2422c81..0520a10 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ Summary of the changes done in each version. +## 1.5.0-SNAPSHOT (Not yet released) + ## 1.4.0 (2017-07-13) ### Ant Tasks diff --git a/build.gradle b/build.gradle index e5e0859..5b27079 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ subprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.4.0' + version '1.5.0-SNAPSHOT' ext.versionBC = '1.0.0' repositories { From 82b79441660d6832c273a695930f63903ca99594 Mon Sep 17 00:00:00 2001 From: Simon Bennetts Date: Thu, 3 Aug 2017 09:35:04 +0200 Subject: [PATCH 037/148] Added synk badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bccfa58..87fdfc1 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Build Status](https://api.travis-ci.org/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.org/zaproxy/zap-api-java) +[![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) The Java implementation to access the [OWASP ZAP API](https://github.com/zaproxy/zaproxy/wiki/ApiDetails). For more information about OWASP ZAP consult the (main) [OWASP ZAP project](https://github.com/zaproxy/zaproxy/). From 8330ace5610c337c9df5e455b45d42ececab19d6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 21 Sep 2017 20:54:33 +0100 Subject: [PATCH 038/148] Update Gradle to 4.2.1 Update Gradle to latest version, 4.2.1. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 54706 -> 54708 bytes gradle/wrapper/gradle-wrapper.properties | 3 +-- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 5b27079..a51e530 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ task wrapper(type: Wrapper) { - gradleVersion = '4.0' + gradleVersion = '4.2.1' } apply from: "gradle/compile.gradle" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e894adac2635380847ce7e51449df6bcada98645..736fb7d3f94c051b359fc7ae7212d351bc094bdd 100644 GIT binary patch delta 759 zcmYk4T}V@57{|~1So1_vk4~2!7vl1(Bigz!tp;-xwi<)chhjzFhEW-K5p)qW`k=zf z_D4iZr0CAT9Cgt}YHiNk+|)TQ$}4X|5lSP1x~X@sQ#^1u&+qsApZ7h7^ZNQy-u9)m zS8tqOtV^>!wbsk?dCRTKtxRfH2Ygol21&9@`03xBMUvZ@Dlh&0^UEMfQYODqIATI$ zpnPQ(4+0IW8*_o3Y!HT#8n%EJ1xB13(a6M5SeXMSQ}Kagy)J>?Q5lbPGSY(@?MYoV z4Z(f%Y||>e4_atp%L+N@OKzgV>Cr=Uzd)43qx)%xIa%s(!JLWGkb>%MmAadk{1#VOF{EXLxvf)dyI zG1Zl9rXgjZ3m+rL=nC< zE4x6)v`S4cIht{A+Cs`Z=;LO5owl%fY>qe5_aVr`R`LD5xXL~u62C|te)Rhb%iT^! e*;2M7%QFApc4_?q&0ReL;`t4pnR1;ikbwWrsS$ht delta 791 zcmYk4T}YEr7{}lDQD1d!y5ZM+6;_&|ugo%7T5hbuXk;!UNsZ`(v_hDspNSSE#C?tyzeHo}0Wy~>KD@E*}_Xw3IMpZH{c#qRa za?~Z^o%aB3X6-oD;!*mnk2t8ZccaLs#dCvJ%}(9^x(ys&$&)Z=NXPo3LdLx9P!@)R zS`-^&^K*hBvzOgKeY^p1bl>Uqbi!iWKLAoI>>xb05Z2V|!v$jS!tQgH?2Pm}kf|pHwsblpN zDj4TBchyGMCeS%ih`v?U(P^ZFSx2WOUhwy9Y)3bs2{+KUIjH8%=nH7!49ns?LgDKK k7p7c$P`{=&L|${`38%49=-AT#9|==m(Y01AS=^D}KQWvWjsO4v diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3350b20..74bb778 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-bin.zip -distributionSha256Sum=56bd2dde29ba2a93903c557da1745cafd72cdd8b6b0b83c05a40ed7896b79dfe \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip From 94ecbb6166b1c5766a5ddfca6c8666418994e1f5 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 14 Jul 2017 22:04:37 +0100 Subject: [PATCH 039/148] Check binary compatibility as part of check task Change japicmp task to run as part of the check task, set it to have as input file the jar (to ensure it runs, always, when jar is changed), add a task description and add it to verification tasks. Also, update the plugin to latest version available. Set BC version to latest released version. --- build.gradle | 2 +- .../zap-clientapi/zap-clientapi.gradle | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index a51e530..20f4ded 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ subprojects { group = 'org.zaproxy' version '1.5.0-SNAPSHOT' - ext.versionBC = '1.0.0' + ext.versionBC = '1.3.0' repositories { mavenLocal() diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index f6a7211..367fc1e 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,5 +1,5 @@ plugins { - id "me.champeau.gradle.japicmp" version "0.1.2" + id "me.champeau.gradle.japicmp" version "0.2.5" id "org.owasp.dependencycheck" version "1.4.4.1" } @@ -20,11 +20,25 @@ jar { } } -task japicmp(dependsOn: jar, type: me.champeau.gradle.ArtifactJapicmpTask) { - baseline = "${project.group}:${project.name}:${versionBC}@jar" - to = jar.archivePath +configurations { + japicmpBaseline +} + +dependencies { + japicmpBaseline ("${project.group}:${project.name}:$versionBC") { force = true } +} + +task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { + group 'verification' + description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." + check.dependsOn 'japicmp' + inputs.file(jar) + + oldClasspath = configurations.japicmpBaseline + newClasspath = configurations.runtime + files(jar) onlyBinaryIncompatibleModified = true failOnModification = true + ignoreMissingClasses = true htmlOutputFile = file("$buildDir/reports/japi.html") } From 05ba124f101ac36c4f112b3eddf510534735ec6c Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 28 Nov 2017 16:34:51 +0000 Subject: [PATCH 040/148] Regenerate core APIs for ZAP version 2.7.0 Regenerate core APIs for ZAP version 2.7.0 (some tweaks were done to keep the API client binary compatible with previous versions). --- CHANGES.md | 4 + .../java/org/zaproxy/clientapi/gen/Acsrf.java | 2 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 27 +++- .../zaproxy/clientapi/gen/Authentication.java | 2 +- .../zaproxy/clientapi/gen/Authorization.java | 2 +- .../org/zaproxy/clientapi/gen/Autoupdate.java | 2 +- .../java/org/zaproxy/clientapi/gen/Break.java | 2 +- .../org/zaproxy/clientapi/gen/Context.java | 2 +- .../java/org/zaproxy/clientapi/gen/Core.java | 149 ++++++++++++++++-- .../org/zaproxy/clientapi/gen/ForcedUser.java | 2 +- .../zaproxy/clientapi/gen/HttpSessions.java | 2 +- .../org/zaproxy/clientapi/gen/Params.java | 2 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 2 +- .../org/zaproxy/clientapi/gen/Script.java | 10 +- .../org/zaproxy/clientapi/gen/Search.java | 2 +- .../clientapi/gen/SessionManagement.java | 2 +- .../org/zaproxy/clientapi/gen/Spider.java | 45 +++++- .../java/org/zaproxy/clientapi/gen/Stats.java | 2 +- .../java/org/zaproxy/clientapi/gen/Users.java | 2 +- .../gen/deprecated/CoreDeprecated.java | 34 ++++ .../gen/deprecated/ScriptDeprecated.java | 14 ++ 21 files changed, 278 insertions(+), 33 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0520a10..1c9d461 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,10 @@ Summary of the changes done in each version. ## 1.5.0-SNAPSHOT (Not yet released) +### Updated APIs + + - Core APIs updated for ZAP version 2.7.0. + ## 1.4.0 (2017-07-13) ### Ant Tasks diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index cac4606..c79fc50 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index 62e9db3..af1c22a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,12 +56,18 @@ public ApiResponse scanProgress(String scanid) throws ClientApiException { return api.callApi("ascan", "view", "scanProgress", map); } + /** + * Gets the IDs of the messages sent during the scan with the given ID. A message can be obtained with 'message' core view. + */ public ApiResponse messagesIds(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("ascan", "view", "messagesIds", map); } + /** + * Gets the IDs of the alerts raised during the scan with the given ID. An alert can be obtained with 'alert' core view. + */ public ApiResponse alertsIds(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); @@ -453,6 +459,15 @@ public ApiResponse updateScanPolicy(String scanpolicyname, String alertthreshold return api.callApi("ascan", "action", "updateScanPolicy", map); } + /** + * Imports a Scan Policy using the given file system path. + */ + public ApiResponse importScanPolicy(String path) throws ClientApiException { + Map map = new HashMap<>(); + map.put("path", path); + return api.callApi("ascan", "action", "importScanPolicy", map); + } + /** * Adds a new parameter excluded from the scan, using the specified name. Optionally sets if the new entry applies to a specific URL (default, all URLs) and sets the ID of the type of the parameter (default, ID of any type). The type IDs can be obtained with the view excludedParamTypes. */ @@ -495,6 +510,16 @@ public ApiResponse removeExcludedParam(String idx) throws ClientApiException { return api.callApi("ascan", "action", "removeExcludedParam", map); } + /** + * Skips the scanner using the given IDs of the scan and the scanner. + */ + public ApiResponse skipScanner(String scanid, String scannerid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + map.put("scannerId", scannerid); + return api.callApi("ascan", "action", "skipScanner", map); + } + public ApiResponse setOptionAttackPolicy(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java index c778f65..97cb977 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java index 0d8a3a3..398acfa 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index 925f7e6..fee9298 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index f995e5d..a0e03b7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 010c735..5250734 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index d07c87e..e66d0f3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,9 +50,9 @@ public ApiResponse alert(String id) throws ClientApiException { } /** - * Gets the alerts raised by ZAP, optionally filtering by URL and paginating with 'start' position and 'count' of alerts + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with 'start' position and 'count' of alerts */ - public ApiResponse alerts(String baseurl, String start, String count) throws ClientApiException { + public ApiResponse alerts(String baseurl, String start, String count, String riskid) throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); @@ -63,17 +63,34 @@ public ApiResponse alerts(String baseurl, String start, String count) throws Cli if (count != null) { map.put("count", count); } + if (riskid != null) { + map.put("riskId", riskid); + } return api.callApi("core", "view", "alerts", map); } /** - * Gets the number of alerts, optionally filtering by URL + * Gets number of alerts grouped by each risk level, optionally filtering by URL + */ + public ApiResponse alertsSummary(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "alertsSummary", map); + } + + /** + * Gets the number of alerts, optionally filtering by URL or riskId */ - public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { + public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); } + if (riskid != null) { + map.put("riskId", riskid); + } return api.callApi("core", "view", "numberOfAlerts", map); } @@ -92,14 +109,18 @@ public ApiResponse sites() throws ClientApiException { } /** - * Gets the URLs accessed through/by ZAP + * Gets the URLs accessed through/by ZAP, optionally filtering by (base) URL. */ - public ApiResponse urls() throws ClientApiException { - return api.callApi("core", "view", "urls", null); + public ApiResponse urls(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "urls", map); } /** - * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, cookies and note. + * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, cookies, note, type, RTT, and timestamp. */ public ApiResponse message(String id) throws ClientApiException { Map map = new HashMap<>(); @@ -124,6 +145,15 @@ public ApiResponse messages(String baseurl, String start, String count) throws C return api.callApi("core", "view", "messages", map); } + /** + * Gets the HTTP messages with the given IDs. + */ + public ApiResponse messagesById(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApi("core", "view", "messagesById", map); + } + /** * Gets the number of messages, optionally filtering by URL */ @@ -150,7 +180,7 @@ public ApiResponse version() throws ClientApiException { } /** - * Gets the regular expressions, applied to URLs, to exclude from the Proxy + * Gets the regular expressions, applied to URLs, to exclude from the local proxies. */ public ApiResponse excludedFromProxy() throws ClientApiException { return api.callApi("core", "view", "excludedFromProxy", null); @@ -201,6 +231,37 @@ public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); } + /** + * Gets the path to ZAP's home directory. + */ + public ApiResponse zapHomePath() throws ClientApiException { + return api.callApi("core", "view", "zapHomePath", null); + } + + /** + * Gets the maximum number of alert instances to include in a report. + */ + public ApiResponse optionMaximumAlertInstances() throws ClientApiException { + return api.callApi("core", "view", "optionMaximumAlertInstances", null); + } + + /** + * Gets whether or not related alerts will be merged in any reports generated. + */ + public ApiResponse optionMergeRelatedAlerts() throws ClientApiException { + return api.callApi("core", "view", "optionMergeRelatedAlerts", null); + } + + /** + * Gets the path to the file with alert overrides. + */ + public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { + return api.callApi("core", "view", "optionAlertOverridesFilePath", null); + } + + /** + * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider messages or CONNECT requests to outgoing proxy). + */ public ApiResponse optionDefaultUserAgent() throws ClientApiException { return api.callApi("core", "view", "optionDefaultUserAgent", null); } @@ -319,14 +380,14 @@ public ApiResponse snapshotSession() throws ClientApiException { } /** - * Clears the regexes of URLs excluded from the proxy. + * Clears the regexes of URLs excluded from the local proxies. */ public ApiResponse clearExcludedFromProxy() throws ClientApiException { return api.callApi("core", "action", "clearExcludedFromProxy", null); } /** - * Adds a regex of URLs that should be excluded from the proxy. + * Adds a regex of URLs that should be excluded from the local proxies. */ public ApiResponse excludeFromProxy(String regex) throws ClientApiException { Map map = new HashMap<>(); @@ -350,7 +411,7 @@ public ApiResponse setMode(String mode) throws ClientApiException { } /** - * Generates a new Root CA certificate for the Local Proxy. + * Generates a new Root CA certificate for the local proxies. */ public ApiResponse generateRootCA() throws ClientApiException { return api.callApi("core", "action", "generateRootCA", null); @@ -375,6 +436,15 @@ public ApiResponse deleteAllAlerts() throws ClientApiException { return api.callApi("core", "action", "deleteAllAlerts", null); } + /** + * Deletes the alert with the given ID. + */ + public ApiResponse deleteAlert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "action", "deleteAlert", map); + } + public ApiResponse runGarbageCollection() throws ClientApiException { return api.callApi("core", "action", "runGarbageCollection", null); } @@ -450,6 +520,38 @@ public ApiResponse disableAllProxyChainExcludedDomains() throws ClientApiExcepti return api.callApi("core", "action", "disableAllProxyChainExcludedDomains", null); } + /** + * Sets the maximum number of alert instances to include in a report. A value of zero is treated as unlimited. + */ + public ApiResponse setOptionMaximumAlertInstances(String numberofinstances) throws ClientApiException { + Map map = new HashMap<>(); + map.put("numberOfInstances", numberofinstances); + return api.callApi("core", "action", "setOptionMaximumAlertInstances", map); + } + + /** + * Sets whether or not related alerts will be merged in any reports generated. + */ + public ApiResponse setOptionMergeRelatedAlerts(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("core", "action", "setOptionMergeRelatedAlerts", map); + } + + /** + * Sets (or clears, if empty) the path to the file with alert overrides. + */ + public ApiResponse setOptionAlertOverridesFilePath(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + if (filepath != null) { + map.put("filePath", filepath); + } + return api.callApi("core", "action", "setOptionAlertOverridesFilePath", map); + } + + /** + * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider messages or CONNECT requests to outgoing proxy). + */ public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -530,6 +632,9 @@ public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { return api.callApi("core", "action", "setOptionTimeoutInSecs", map); } + /** + * Sets whether or not the outgoing proxy should be used. The address/hostname of the outgoing proxy must be set to enable this option. + */ public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); @@ -547,7 +652,7 @@ public byte[] proxypac() throws ClientApiException { } /** - * Gets the Root CA certificate of the Local Proxy. + * Gets the Root CA certificate used by the local proxies. */ public byte[] rootcert() throws ClientApiException { return api.callApiOther("core", "other", "rootcert", null); @@ -573,6 +678,13 @@ public byte[] htmlreport() throws ClientApiException { return api.callApiOther("core", "other", "htmlreport", null); } + /** + * Generates a report in JSON format + */ + public byte[] jsonreport() throws ClientApiException { + return api.callApiOther("core", "other", "jsonreport", null); + } + /** * Generates a report in Markdown format */ @@ -606,6 +718,15 @@ public byte[] messagesHar(String baseurl, String start, String count) throws Cli return api.callApiOther("core", "other", "messagesHar", map); } + /** + * Gets the HTTP messages with the given IDs, in HAR format. + */ + public byte[] messagesHarById(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApiOther("core", "other", "messagesHarById", map); + } + /** * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, the request sent and response received and followed redirections, if any. The Mode is enforced when sending the request (and following redirections), custom manual requests are not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java index e359a20..cbd9bc3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index 0430ea7..6bb0989 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java index 1899002..c19b47f 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index e27f145..42d7c15 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 1abeb0a..bd90ebd 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ package org.zaproxy.clientapi.gen; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; import org.zaproxy.clientapi.core.ApiResponse; @@ -73,9 +74,9 @@ public ApiResponse disable(String scriptname) throws ClientApiException { } /** - * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description + * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description, and a charset name to read the script (the charset name is required if the script is not in UTF-8, for example, in ISO-8859-1). */ - public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription) throws ClientApiException { + public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription, Charset charset) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); map.put("scriptType", scripttype); @@ -84,6 +85,9 @@ public ApiResponse load(String scriptname, String scripttype, String scriptengin if (scriptdescription != null) { map.put("scriptDescription", scriptdescription); } + if (charset != null) { + map.put("charset", charset.name()); + } return api.callApi("script", "action", "load", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index 7b19a5c..ed20b18 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java index 8396507..f89fa40 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 1ce8a52..dba56fa 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -80,6 +80,17 @@ public ApiResponse allUrls() throws ClientApiException { return api.callApi("spider", "view", "allUrls", null); } + /** + * Returns a list of the names of the nodes added to the Sites tree by the specified scan. + */ + public ApiResponse addedNodes(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "view", "addedNodes", map); + } + /** * Gets all the domains that are always in scope. For each domain the following are shown: the index, the value (domain), if enabled, and if specified as a regex. */ @@ -124,6 +135,13 @@ public ApiResponse optionMaxDuration() throws ClientApiException { return api.callApi("spider", "view", "optionMaxDuration", null); } + /** + * Gets the maximum size, in bytes, that a response might have to be parsed. + */ + public ApiResponse optionMaxParseSizeBytes() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxParseSizeBytes", null); + } + public ApiResponse optionMaxScansInUI() throws ClientApiException { return api.callApi("spider", "view", "optionMaxScansInUI", null); } @@ -154,6 +172,13 @@ public ApiResponse optionUserAgent() throws ClientApiException { return api.callApi("spider", "view", "optionUserAgent", null); } + /** + * Gets whether or not a spider process should accept cookies while spidering. + */ + public ApiResponse optionAcceptCookies() throws ClientApiException { + return api.callApi("spider", "view", "optionAcceptCookies", null); + } + public ApiResponse optionHandleODataParametersVisited() throws ClientApiException { return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); } @@ -385,6 +410,15 @@ public ApiResponse setOptionUserAgent(String string) throws ClientApiException { return api.callApi("spider", "action", "setOptionUserAgent", map); } + /** + * Sets whether or not a spider process should accept cookies while spidering. + */ + public ApiResponse setOptionAcceptCookies(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionAcceptCookies", map); + } + public ApiResponse setOptionHandleODataParametersVisited(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); @@ -412,6 +446,15 @@ public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { return api.callApi("spider", "action", "setOptionMaxDuration", map); } + /** + * Sets the maximum size, in bytes, that a response might have to be parsed. This allows the spider to skip big responses/files. + */ + public ApiResponse setOptionMaxParseSizeBytes(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxParseSizeBytes", map); + } + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java index e661155..287efc3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 4b3e2d3..698045e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java index 826b38e..7216465 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -563,4 +563,38 @@ public byte[] sendHarRequest(String apikey, String request, String followredirec return api.callApiOther("core", "other", "sendHarRequest", map); } + /** + * Gets the alerts raised by ZAP, optionally filtering by URL and paginating with 'start' position and 'count' of alerts + */ + public ApiResponse alerts(String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("core", "view", "alerts", map); + } + + /** + * Gets the number of alerts, optionally filtering by URL + */ + public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "numberOfAlerts", map); + } + + /** + * Gets the URLs accessed through/by ZAP + */ + public ApiResponse urls() throws ClientApiException { + return api.callApi("core", "view", "urls", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java index 5d6b128..7353b45 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java @@ -120,4 +120,18 @@ public ApiResponse runStandAloneScript(String apikey, String scriptname) throws return api.callApi("script", "action", "runStandAloneScript", map); } + /** + * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description + */ + public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("scriptType", scripttype); + map.put("scriptEngine", scriptengine); + map.put("fileName", filename); + if (scriptdescription != null) { + map.put("scriptDescription", scriptdescription); + } + return api.callApi("script", "action", "load", map); + } } From 49d08e24f0f73f2872a30aa1d1f19a9cfb2fa177 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 28 Nov 2017 18:34:09 +0000 Subject: [PATCH 041/148] Regenerate reveal API Regenerate the API of Reveal add-on (just doc updates). --- .../src/main/java/org/zaproxy/clientapi/gen/Reveal.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java index c7d6d7c..6838f04 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java @@ -2,7 +2,7 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2017 the ZAP development team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,8 @@ public Reveal(ClientApi api) { } /** + * Tells if shows hidden fields and enables disabled fields + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse reveal() throws ClientApiException { @@ -48,6 +50,8 @@ public ApiResponse reveal() throws ClientApiException { } /** + * Sets if shows hidden fields and enables disabled fields + *

* This component is optional and therefore the API will only work if it is installed */ public ApiResponse setReveal(String reveal) throws ClientApiException { From e20d1341f02e77bb79909a9c2448cbc2605e16c5 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 30 Nov 2017 16:01:06 +0000 Subject: [PATCH 042/148] Bump version number to 1.5.0 --- CHANGES.md | 2 +- README.md | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1c9d461..9975d08 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ Summary of the changes done in each version. -## 1.5.0-SNAPSHOT (Not yet released) +## 1.5.0 (2017-11-30) ### Updated APIs diff --git a/README.md b/README.md index 87fdfc1..9d6b293 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.4.0` + * Version: `1.5.0` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). diff --git a/build.gradle b/build.gradle index 20f4ded..f3fe19b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ subprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.5.0-SNAPSHOT' + version '1.5.0' ext.versionBC = '1.3.0' repositories { From ba57a46f85b730f7d994f19072d11b6e0b1940cd Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 30 Nov 2017 16:04:02 +0000 Subject: [PATCH 043/148] Bump version number to 1.6.0-SNAPSHOT --- CHANGES.md | 3 +++ build.gradle | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 9975d08..c816caf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,9 @@ Summary of the changes done in each version. +## 1.6.0 (Not yet released) + + ## 1.5.0 (2017-11-30) ### Updated APIs diff --git a/build.gradle b/build.gradle index f3fe19b..3f1739b 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ subprojects { apply plugin: 'java' group = 'org.zaproxy' - version '1.5.0' + version '1.6.0-SNAPSHOT' ext.versionBC = '1.3.0' repositories { From 987875af76ac3d3e4b35a175abad6918cb2f1cda Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 1 Dec 2017 23:52:06 +0000 Subject: [PATCH 044/148] Update version for binary compatibility checks Update version to latest released version (1.5.0). --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3f1739b..b73b972 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ subprojects { group = 'org.zaproxy' version '1.6.0-SNAPSHOT' - ext.versionBC = '1.3.0' + ext.versionBC = '1.5.0' repositories { mavenLocal() From b147412e23c7dc4660afa38ab814a38b18dd6b7d Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 1 Dec 2017 23:52:46 +0000 Subject: [PATCH 045/148] Update OWASP Dependency-Check plugin to 3.0.2 Update OWASP Dependency-Check plugin to latest version and set to skip configuration used for binary compatibility tests (just needs to check the current version). --- subprojects/zap-clientapi/zap-clientapi.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 367fc1e..38d822c 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,11 +1,10 @@ plugins { id "me.champeau.gradle.japicmp" version "0.2.5" - id "org.owasp.dependencycheck" version "1.4.4.1" + id "org.owasp.dependencycheck" version "3.0.2" } apply plugin: 'maven' apply plugin: 'signing' -apply plugin: 'org.owasp.dependencycheck' dependencies { compile 'org.jdom:jdom:1.1.3' } @@ -28,6 +27,10 @@ dependencies { japicmpBaseline ("${project.group}:${project.name}:$versionBC") { force = true } } +dependencyCheck { + skipConfigurations += "japicmpBaseline" +} + task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { group 'verification' description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." From 6abcdb336d372144305b5c45d9b82cc3fa6fd106 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 9 Mar 2018 21:56:14 +0000 Subject: [PATCH 046/148] Normalise line endings Add .gitattributes to normalise the line endings of the files. Update files accordingly, Java files are now using the same line endings and gradlew.bat will use CRLF, always. --- .gitattributes | 13 + gradlew.bat | 168 +- .../zaproxy/clientapi/ant/AccessUrlTask.java | 90 +- .../clientapi/ant/ActiveScanUrlTask.java | 62 +- .../zaproxy/clientapi/ant/AlertCheckTask.java | 134 +- .../org/zaproxy/clientapi/ant/AlertTask.java | 252 +-- .../clientapi/ant/LoadSessionTask.java | 90 +- .../zaproxy/clientapi/ant/NewSessionTask.java | 90 +- .../clientapi/ant/SaveSessionTask.java | 90 +- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 104 +- .../zaproxy/clientapi/ant/StopZapTask.java | 70 +- .../org/zaproxy/clientapi/ant/ZapTask.java | 144 +- .../clientapi/examples/SimpleExample.java | 186 +-- .../org/zaproxy/clientapi/examples/Test.java | 110 +- .../org/zaproxy/clientapi/core/Alert.java | 1010 ++++++------ .../zaproxy/clientapi/core/AlertsFile.java | 230 +-- .../org/zaproxy/clientapi/core/ClientApi.java | 1380 ++++++++--------- .../zaproxy/clientapi/core/ClientApiMain.java | 660 ++++---- 18 files changed, 2448 insertions(+), 2435 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1a939d9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +* text=auto + +*.java text +*.properties text +*.md text +*.xml text +*.gradle text + +*.bat text eol=crlf +*.sh text eol=lf +gradlew text eol=lf + +*.jar binary \ No newline at end of file diff --git a/gradlew.bat b/gradlew.bat index e95643d..f955316 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,84 +1,84 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java index d545875..5a927fa 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java @@ -1,45 +1,45 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class AccessUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().accessUrl(url); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class AccessUrlTask extends ZapTask { + + private String url; + + @Override + public void execute() throws BuildException { + try { + this.getClientApi().accessUrl(url); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index ff12fc6..286a595 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -1,31 +1,31 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ClientApiException; - -public class ActiveScanUrlTask extends AbstractActiveScanTask { - - @Override - protected ApiResponse startScan() throws ClientApiException { - return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApiException; + +public class ActiveScanUrlTask extends AbstractActiveScanTask { + + @Override + protected ApiResponse startScan() throws ClientApiException { + return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java index 90c9326..aa94b9f 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java @@ -1,67 +1,67 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.tools.ant.BuildException; -import org.zaproxy.clientapi.core.Alert; - -public class AlertCheckTask extends ZapTask { - - private List ignoreAlertTasks = new ArrayList<>(); - private List requireAlertTasks = new ArrayList<>(); - - @Override - public void execute() throws BuildException { - try { - List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); - List requireAlerts = new ArrayList<>(requireAlertTasks.size()); - for (AlertTask alert: ignoreAlertTasks) { - ignoreAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); - } - for (AlertTask alert: requireAlertTasks) { - requireAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); - } - - this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public void addIgnoreAlert(AlertTask alert) { - this.ignoreAlertTasks.add(alert); - } - - public void addRequireAlert(AlertTask alert) { - this.requireAlertTasks.add(alert); - } - - public List getIgnoreAlerts() { - return ignoreAlertTasks; - } - - public List getRequireAlerts() { - return requireAlertTasks; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tools.ant.BuildException; +import org.zaproxy.clientapi.core.Alert; + +public class AlertCheckTask extends ZapTask { + + private List ignoreAlertTasks = new ArrayList<>(); + private List requireAlertTasks = new ArrayList<>(); + + @Override + public void execute() throws BuildException { + try { + List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); + List requireAlerts = new ArrayList<>(requireAlertTasks.size()); + for (AlertTask alert: ignoreAlertTasks) { + ignoreAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); + } + for (AlertTask alert: requireAlertTasks) { + requireAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); + } + + this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public void addIgnoreAlert(AlertTask alert) { + this.ignoreAlertTasks.add(alert); + } + + public void addRequireAlert(AlertTask alert) { + this.requireAlertTasks.add(alert); + } + + public List getIgnoreAlerts() { + return ignoreAlertTasks; + } + + public List getRequireAlerts() { + return requireAlertTasks; + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index 83e3ffc..c45767a 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -1,126 +1,126 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.Task; - -public class AlertTask extends Task { - private String name; - private String risk; - /** - * @deprecated - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - private String reliability; - private String confidence; - private String url; - private String other; - private String param; - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @since 1.1.0 - */ - public String getName() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @since 1.1.0 - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @deprecated (1.1.0) Use {@link #getName()} instead. - */ - @Deprecated - public String getAlert() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @deprecated (1.1.0) Use {@link #setName(String)} instead. - */ - @Deprecated - public void setAlert(String name) { - this.name = name; - } - public String getRisk() { - return risk; - } - public void setRisk(String risk) { - this.risk = risk; - } - /** - * @deprecated (2.4.0) {@link #getConfidence()}. - * Use of reliability has been deprecated in favour of using confidence. - */ - @Deprecated - public String getReliability() { - return reliability; - } - /** - * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(String reliability) { - this.reliability = reliability; - } - public String getConfidence() { - return confidence; - } - public void setConfidence(String confidence) { - this.confidence = confidence; - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } - public String getOther() { - return other; - } - public void setOther(String other) { - this.other = other; - } - public String getParam() { - return param; - } - public void setParam(String param) { - this.param = param; - } - -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.Task; + +public class AlertTask extends Task { + private String name; + private String risk; + /** + * @deprecated + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + private String reliability; + private String confidence; + private String url; + private String other; + private String param; + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since 1.1.0 + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since 1.1.0 + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (1.1.0) Use {@link #getName()} instead. + */ + @Deprecated + public String getAlert() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (1.1.0) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; + } + public String getRisk() { + return risk; + } + public void setRisk(String risk) { + this.risk = risk; + } + /** + * @deprecated (2.4.0) {@link #getConfidence()}. + * Use of reliability has been deprecated in favour of using confidence. + */ + @Deprecated + public String getReliability() { + return reliability; + } + /** + * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + public void setReliability(String reliability) { + this.reliability = reliability; + } + public String getConfidence() { + return confidence; + } + public void setConfidence(String confidence) { + this.confidence = confidence; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getOther() { + return other; + } + public void setOther(String other) { + this.other = other; + } + public String getParam() { + return param; + } + public void setParam(String param) { + this.param = param; + } + +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java index 6f38a46..afdeb53 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java @@ -1,45 +1,45 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class LoadSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.loadSession(name); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class LoadSessionTask extends ZapTask { + + private String name; + + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.loadSession(name); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java index 30a6d76..be9e83c 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java @@ -1,45 +1,45 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class NewSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.newSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class NewSessionTask extends ZapTask { + + private String name; + + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.newSession(name, "true"); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java index 9b00e1c..84a88f6 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java @@ -1,45 +1,45 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class SaveSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.saveSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class SaveSessionTask extends ZapTask { + + private String name; + + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.saveSession(name, "true"); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 5fbf3bd..634ef01 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -1,52 +1,52 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class SpiderUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); - - int progress; - do { - progress = Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); - Thread.sleep(1000); - } while (progress < 100); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class SpiderUrlTask extends ZapTask { + + private String url; + + @Override + public void execute() throws BuildException { + try { + String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); + + int progress; + do { + progress = Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); + Thread.sleep(1000); + } while (progress < 100); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 00fb3fd..6ae309b 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -1,35 +1,35 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class StopZapTask extends ZapTask { - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.shutdown(); - } catch (Exception e) { - throw new BuildException(e); - } - } - -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.BuildException; + +public class StopZapTask extends ZapTask { + + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.shutdown(); + } catch (Exception e) { + throw new BuildException(e); + } + } + +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java index 32378bb..7ddcd41 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java @@ -1,72 +1,72 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.Task; -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ApiResponseElement; -import org.zaproxy.clientapi.core.ClientApi; - -public abstract class ZapTask extends Task { - private String zapAddress; - private int zapPort; - private boolean debug = false; - private String apikey; - - protected ClientApi getClientApi() { - return new ClientApi(zapAddress, zapPort, apikey, debug); - } - - public String getZapAddress() { - return zapAddress; - } - public void setZapAddress(String zapAddress) { - this.zapAddress = zapAddress; - } - public int getZapPort() { - return zapPort; - } - public void setZapPort(int zapPort) { - this.zapPort = zapPort; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean debug) { - this.debug = debug; - } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } - - protected String extractValue(ApiResponse element) { - if (element instanceof ApiResponseElement) { - return ((ApiResponseElement) element).getValue(); - } - return null; - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.ant; + +import org.apache.tools.ant.Task; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ApiResponseElement; +import org.zaproxy.clientapi.core.ClientApi; + +public abstract class ZapTask extends Task { + private String zapAddress; + private int zapPort; + private boolean debug = false; + private String apikey; + + protected ClientApi getClientApi() { + return new ClientApi(zapAddress, zapPort, apikey, debug); + } + + public String getZapAddress() { + return zapAddress; + } + public void setZapAddress(String zapAddress) { + this.zapAddress = zapAddress; + } + public int getZapPort() { + return zapPort; + } + public void setZapPort(int zapPort) { + this.zapPort = zapPort; + } + + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public String getApikey() { + return apikey; + } + + public void setApikey(String apikey) { + this.apikey = apikey; + } + + protected String extractValue(ApiResponse element) { + if (element instanceof ApiResponseElement) { + return ((ApiResponseElement) element).getValue(); + } + return null; + } +} diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index cec7886..7df206e 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -1,93 +1,93 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2016 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.examples; - -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ApiResponseElement; -import org.zaproxy.clientapi.core.ClientApi; - -/** - * A simple example showing how to use the API to spider and active scan a site and then retrieve and print out the alerts. - *

- * ZAP must be running on the specified host and port for this script to work - */ -public class SimpleExample { - - private static final String ZAP_ADDRESS = "localhost"; - private static final int ZAP_PORT = 8090; - private static final String ZAP_API_KEY = null; // Change this if you have set the apikey in ZAP via Options / API - - private static final String TARGET = "http://localhost:8080/bodgeit/"; - - public static void main(String[] args) { - ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); - - try { - // Start spidering the target - System.out.println("Spider : " + TARGET); - // It's not necessary to pass the ZAP API key again, already set when creating the ClientApi. - ApiResponse resp = api.spider.scan(TARGET, null, null, null, null); - String scanid; - int progress; - - // The scan now returns a scan id to support concurrent scanning - scanid = ((ApiResponseElement) resp).getValue(); - - // Poll the status until it completes - while (true) { - Thread.sleep(1000); - progress = Integer.parseInt(((ApiResponseElement) api.spider.status(scanid)).getValue()); - System.out.println("Spider progress : " + progress + "%"); - if (progress >= 100) { - break; - } - } - System.out.println("Spider complete"); - - // Give the passive scanner a chance to complete - Thread.sleep(2000); - - System.out.println("Active scan : " + TARGET); - resp = api.ascan.scan(TARGET, "True", "False", null, null, null); - - // The scan now returns a scan id to support concurrent scanning - scanid = ((ApiResponseElement) resp).getValue(); - - // Poll the status until it completes - while (true) { - Thread.sleep(5000); - progress = Integer.parseInt(((ApiResponseElement) api.ascan.status(scanid)).getValue()); - System.out.println("Active Scan progress : " + progress + "%"); - if (progress >= 100) { - break; - } - } - System.out.println("Active Scan complete"); - - System.out.println("Alerts:"); - System.out.println(new String(api.core.xmlreport())); - - } catch (Exception e) { - System.out.println("Exception : " + e.getMessage()); - e.printStackTrace(); - } - } - -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2016 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.examples; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ApiResponseElement; +import org.zaproxy.clientapi.core.ClientApi; + +/** + * A simple example showing how to use the API to spider and active scan a site and then retrieve and print out the alerts. + *

+ * ZAP must be running on the specified host and port for this script to work + */ +public class SimpleExample { + + private static final String ZAP_ADDRESS = "localhost"; + private static final int ZAP_PORT = 8090; + private static final String ZAP_API_KEY = null; // Change this if you have set the apikey in ZAP via Options / API + + private static final String TARGET = "http://localhost:8080/bodgeit/"; + + public static void main(String[] args) { + ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); + + try { + // Start spidering the target + System.out.println("Spider : " + TARGET); + // It's not necessary to pass the ZAP API key again, already set when creating the ClientApi. + ApiResponse resp = api.spider.scan(TARGET, null, null, null, null); + String scanid; + int progress; + + // The scan now returns a scan id to support concurrent scanning + scanid = ((ApiResponseElement) resp).getValue(); + + // Poll the status until it completes + while (true) { + Thread.sleep(1000); + progress = Integer.parseInt(((ApiResponseElement) api.spider.status(scanid)).getValue()); + System.out.println("Spider progress : " + progress + "%"); + if (progress >= 100) { + break; + } + } + System.out.println("Spider complete"); + + // Give the passive scanner a chance to complete + Thread.sleep(2000); + + System.out.println("Active scan : " + TARGET); + resp = api.ascan.scan(TARGET, "True", "False", null, null, null); + + // The scan now returns a scan id to support concurrent scanning + scanid = ((ApiResponseElement) resp).getValue(); + + // Poll the status until it completes + while (true) { + Thread.sleep(5000); + progress = Integer.parseInt(((ApiResponseElement) api.ascan.status(scanid)).getValue()); + System.out.println("Active Scan progress : " + progress + "%"); + if (progress >= 100) { + break; + } + } + System.out.println("Active Scan complete"); + + System.out.println("Alerts:"); + System.out.println(new String(api.core.xmlreport())); + + } catch (Exception e) { + System.out.println("Exception : " + e.getMessage()); + e.printStackTrace(); + } + } + +} diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java index 2b085ae..7ea0bab 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java @@ -1,55 +1,55 @@ -package org.zaproxy.clientapi.examples; - -import java.util.ArrayList; -import java.util.List; - -import org.zaproxy.clientapi.core.Alert; -import org.zaproxy.clientapi.core.ClientApi; -import org.zaproxy.clientapi.core.Alert.Confidence; -import org.zaproxy.clientapi.core.Alert.Risk; - -public class Test { - - /** - * @param args - */ - public static void main(String[] args) { - // TODO List - // High priority - // * Start ZAP in background - task still waits! } Need docs? - // * Get checkAlerts to work with inner elements } - // Medium - tidy up - // * Create min zapapi.jar - // * Correct way of installing in Eclipse - // Docs etc - // * Full wave reg test - // * Full wavsep reg test - // * Documentation - // Publicise - // * Blog, tweet etc etc - // * Work out priorities for extending api - // * Complete tasks - more for internal use than anything else - - List ignoreAlerts = new ArrayList<>(2); - ignoreAlerts.add(new Alert("Cookie set without HttpOnly flag", null, Risk.Low, Confidence.Medium, null, null)); - ignoreAlerts.add(new Alert(null, null, Risk.Low, Confidence.Medium, null, null)); - - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, null ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - List requireAlerts = new ArrayList<>(1); - //ignoreAlerts.add(new Alert(null, null, null, null, null, null)); - requireAlerts.add(new Alert("Not present", null, Risk.Low, Confidence.Medium, null, null)); - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, requireAlerts); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } -} - -} +package org.zaproxy.clientapi.examples; + +import java.util.ArrayList; +import java.util.List; + +import org.zaproxy.clientapi.core.Alert; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.Alert.Confidence; +import org.zaproxy.clientapi.core.Alert.Risk; + +public class Test { + + /** + * @param args + */ + public static void main(String[] args) { + // TODO List + // High priority + // * Start ZAP in background - task still waits! } Need docs? + // * Get checkAlerts to work with inner elements } + // Medium - tidy up + // * Create min zapapi.jar + // * Correct way of installing in Eclipse + // Docs etc + // * Full wave reg test + // * Full wavsep reg test + // * Documentation + // Publicise + // * Blog, tweet etc etc + // * Work out priorities for extending api + // * Complete tasks - more for internal use than anything else + + List ignoreAlerts = new ArrayList<>(2); + ignoreAlerts.add(new Alert("Cookie set without HttpOnly flag", null, Risk.Low, Confidence.Medium, null, null)); + ignoreAlerts.add(new Alert(null, null, Risk.Low, Confidence.Medium, null, null)); + + try { + (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, null ); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + List requireAlerts = new ArrayList<>(1); + //ignoreAlerts.add(new Alert(null, null, null, null, null, null)); + requireAlerts.add(new Alert("Not present", null, Risk.Low, Confidence.Medium, null, null)); + try { + (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, requireAlerts); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +} + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index fdf46e2..74523f5 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -1,505 +1,505 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.core; - - -public class Alert { - - public enum Risk {Informational, Low, Medium, High}; - /** - * @deprecated (2.4.0) Replaced by {@link Confidence}. - * Use of reliability has been deprecated in favour of using confidence. - */ - @Deprecated - public enum Reliability {Suspicious, Warning}; - public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; - - private String id; - private String name; - private Risk risk; - /** - * @deprecated (2.4.0) Replaced by {@link Confidence}. - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - private Reliability reliability; - private Confidence confidence; - private String url; - private String other; - private String param; - private String attack; - private String evidence; - private String description; - private String reference; - private String solution; - private int cweId; - private int wascId; - private String messageId; - private String pluginId; - - /** - * Constructs an {@code Alert} from the given {@code ApiResponseSet}. - * - * @param apiResponseSet the {@code ApiResponseSet} returned from an alert related ZAP API call. - * @since 1.1.0 - */ - public Alert(ApiResponseSet apiResponseSet) { - super(); - this.id = apiResponseSet.getStringValue("id"); - this.pluginId = apiResponseSet.getStringValue("pluginId"); - String name = apiResponseSet.getStringValue("name"); - if (name == null) { - // TODO Remove once alert attribute is no longer supported. - name = apiResponseSet.getStringValue("alert"); - } - this.name = name; - this.description = apiResponseSet.getStringValue("description"); - this.risk = stringToRisk(apiResponseSet.getStringValue("risk")); - this.confidence = stringToConfidence(apiResponseSet.getStringValue("confidence")); - this.url = apiResponseSet.getStringValue("url"); - this.other = apiResponseSet.getStringValue("other"); - this.param = apiResponseSet.getStringValue("param"); - this.attack = apiResponseSet.getStringValue("attack"); - this.evidence = apiResponseSet.getStringValue("evidence"); - this.reference = apiResponseSet.getStringValue("reference"); - this.cweId = stringToInt(apiResponseSet.getStringValue("cweid"), 0); - this.wascId = stringToInt(apiResponseSet.getStringValue("wascid"), 0); - this.solution = apiResponseSet.getStringValue("solution"); - this.messageId = apiResponseSet.getStringValue("messageId"); - } - - public Alert(String name, String url, String riskStr, String confidenceStr, - String param, String other) { - super(); - this.name = name; - this.url = url; - this.other = other; - this.param = param; - this.risk = stringToRisk(riskStr); - this.confidence = stringToConfidence(confidenceStr); - } - - public Alert(String name, String url, Risk risk, Confidence confidence, - String param, String other, String attack, String description, String reference, String solution, - String evidence, int cweId, int wascId) { - super(); - this.name = name; - this.risk = risk; - this.confidence = confidence; - this.url = url; - this.other = other; - this.param = param; - this.attack = attack; - this.description = description; - this.reference = reference; - this.solution = solution; - this.evidence = evidence; - this.cweId = cweId; - this.wascId = wascId; - } - - public Alert(String name, String url, Risk risk, Confidence confidence, - String param, String other) { - super(); - this.name = name; - this.risk = risk; - this.confidence = confidence; - this.url = url; - this.other = other; - this.param = param; - } - - public Alert(String name, String url, Risk risk, Confidence confidence) { - super(); - this.name = name; - this.risk = risk; - this.confidence = confidence; - this.url = url; - } - - public Alert(String name, String url) { - super(); - this.name = name; - this.url = url; - } - - /** - * Converts the given {@code string} to an {@code int}. - *

- * If the given {@code string} is {@code null} or not a valid {@code int}, the default value is returned. - * - * @param string the string to be converted to {@code int}. - * @param defaultValue the value to return in case the {@code string} is {@code null} or not an {@code int}. - * @return the {@code int} converted from the {@code string}, or the default value if {@code string} is {@code null} or not - * an {@code int}. - */ - private static int stringToInt(String string, int defaultValue) { - if (string == null) { - return defaultValue; - } - try { - return Integer.parseInt(string); - } catch (NumberFormatException e) { - // Ignore. - } - return defaultValue; - } - - /** - * Converts the given {@code string} to a {@link Risk} value. - * - * @param string the string to be converted to a {@link Risk} value. - * @return the {@code Risk} value converted from the {@code string}, or null if {@code string} is {@code null}. - */ - private static Risk stringToRisk(String string) { - if (string == null) { - return null; - } - return Risk.valueOf(string); - } - - /** - * Converts the given {@code string} to a {@link Confidence} value. - * - * @param string the string to be converted to a {@link Confidence} value. - * @return the {@code Confidence} value converted from the {@code string}, or null if {@code string} is {@code null}. - */ - private static Confidence stringToConfidence(String string) { - if (string == null) { - return null; - } - if ("False Positive".equalsIgnoreCase(string)) { - return Confidence.FalsePositive; - } - return Confidence.valueOf(string); - } - - /** - * Gets the ID of the alert. - * - * @return the ID of the alert. - * @since 1.1.0 - */ - public String getId() { - return id; - } - - /** - * Gets the ID of the plugin/scanner that raised the alert. - * - * @return the ID of the plugin/scanner that raised the alert. - * @since 1.1.0 - */ - public String getPluginId() { - return pluginId; - } - - /** - * Gets the ID of the HTTP message of the alert. - * - * @return the ID of the HTTP message. - * @since 1.1.0 - */ - public String getMessageId() { - return messageId; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @since 1.1.0 - */ - public String getName() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @since 1.1.0 - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @deprecated (1.1.0) Use {@link #getName()} instead. - */ - @Deprecated - public String getAlert() { - return name; - } - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @deprecated (1.1.0) Use {@link #setName(String)} instead. - */ - @Deprecated - public void setAlert(String name) { - this.name = name; - } - public Risk getRisk() { - return risk; - } - public void setRisk(Risk risk) { - this.risk = risk; - } - public void setRisk(String risk) { - this.risk = Risk.valueOf(risk); - } - /** - * @deprecated - * {@link #getConfidence()} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public Reliability getReliability() { - return reliability; - } - /** - * @deprecated - * {@link #setConfidence(Confidence)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(Reliability reliability) { - this.reliability = reliability; - } - /** - * @deprecated - * {@link #setConfidence(String)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(String reliability) { - this.reliability = Reliability.valueOf(reliability); - } - public Confidence getConfidence() { - return confidence; - } - public void setConfidence(Confidence confidence) { - this.confidence = confidence; - } - public void setConfidence(String confidence) { - this.confidence = Confidence.valueOf(confidence); - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } - public String getOther() { - return other; - } - public void setOther(String other) { - this.other = other; - } - public String getParam() { - return param; - } - public void setParam(String param) { - this.param = param; - } - - public String getAttack() { - return attack; - } - - public String getDescription() { - return description; - } - - public String getReference() { - return reference; - } - - public String getSolution() { - return solution; - } - - public String getEvidence() { - return evidence; - } - - public int getCweId() { - return cweId; - } - - public int getWascId() { - return wascId; - } - - public boolean matches (Alert alertFilter) { - boolean matches = true; - if (alertFilter.getName() != null && ! alertFilter.getName().equals(name) ) { - matches = false; - } - if (alertFilter.getRisk() != null && ! alertFilter.getRisk().equals(risk) ) { - matches = false; - } - if (alertFilter.getConfidence() != null && ! alertFilter.getConfidence().equals(confidence) ) { - matches = false; - } - - return matches; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((attack == null) ? 0 : attack.hashCode()); - result = prime * result + cweId; - result = prime * result + ((description == null) ? 0 : description.hashCode()); - result = prime * result + ((evidence == null) ? 0 : evidence.hashCode()); - result = prime * result + ((other == null) ? 0 : other.hashCode()); - result = prime * result + ((param == null) ? 0 : param.hashCode()); - result = prime * result + ((reference == null) ? 0 : reference.hashCode()); - result = prime * result + ((confidence == null) ? 0 : confidence.hashCode()); - result = prime * result + ((risk == null) ? 0 : risk.hashCode()); - result = prime * result + ((solution == null) ? 0 : solution.hashCode()); - result = prime * result + ((url == null) ? 0 : url.hashCode()); - result = prime * result + wascId; - return result; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object == null) { - return false; - } - if (getClass() != object.getClass()) { - return false; - } - Alert otherAlert = (Alert) object; - if (name == null) { - if (otherAlert.name != null) { - return false; - } - } else if (!name.equals(otherAlert.name)) { - return false; - } - if (attack == null) { - if (otherAlert.attack != null) { - return false; - } - } else if (!attack.equals(otherAlert.attack)) { - return false; - } - if (cweId != otherAlert.cweId) { - return false; - } - if (description == null) { - if (otherAlert.description != null) { - return false; - } - } else if (!description.equals(otherAlert.description)) { - return false; - } - if (evidence == null) { - if (otherAlert.evidence != null) { - return false; - } - } else if (!evidence.equals(otherAlert.evidence)) { - return false; - } - if (this.other == null) { - if (otherAlert.other != null) { - return false; - } - } else if (!this.other.equals(otherAlert.other)) { - return false; - } - if (param == null) { - if (otherAlert.param != null) { - return false; - } - } else if (!param.equals(otherAlert.param)) { - return false; - } - if (reference == null) { - if (otherAlert.reference != null) { - return false; - } - } else if (!reference.equals(otherAlert.reference)) { - return false; - } - if (confidence != otherAlert.confidence) { - return false; - } - if (risk != otherAlert.risk) { - return false; - } - if (solution == null) { - if (otherAlert.solution != null) { - return false; - } - } else if (!solution.equals(otherAlert.solution)) { - return false; - } - if (url == null) { - if (otherAlert.url != null) { - return false; - } - } else if (!url.equals(otherAlert.url)) { - return false; - } - if (wascId != otherAlert.wascId) { - return false; - } - return true; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("\tAlert: ").append(getAlert()).append(", "); - sb.append("Risk: "); - if (getRisk() != null) { - sb.append(getRisk().name()); - } else { - sb.append("null"); - } - sb.append(", "); - sb.append("Confidence: "); - if (getConfidence() != null) { - sb.append(getConfidence().name()); - } else { - sb.append("null"); - } - sb.append(", "); - sb.append("Url: ").append(getUrl()).append(", "); - sb.append("Param: ").append(getParam()).append(", "); - sb.append("Other: ").append(getOther()); - return sb.toString(); - } - -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.core; + + +public class Alert { + + public enum Risk {Informational, Low, Medium, High}; + /** + * @deprecated (2.4.0) Replaced by {@link Confidence}. + * Use of reliability has been deprecated in favour of using confidence. + */ + @Deprecated + public enum Reliability {Suspicious, Warning}; + public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; + + private String id; + private String name; + private Risk risk; + /** + * @deprecated (2.4.0) Replaced by {@link Confidence}. + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + private Reliability reliability; + private Confidence confidence; + private String url; + private String other; + private String param; + private String attack; + private String evidence; + private String description; + private String reference; + private String solution; + private int cweId; + private int wascId; + private String messageId; + private String pluginId; + + /** + * Constructs an {@code Alert} from the given {@code ApiResponseSet}. + * + * @param apiResponseSet the {@code ApiResponseSet} returned from an alert related ZAP API call. + * @since 1.1.0 + */ + public Alert(ApiResponseSet apiResponseSet) { + super(); + this.id = apiResponseSet.getStringValue("id"); + this.pluginId = apiResponseSet.getStringValue("pluginId"); + String name = apiResponseSet.getStringValue("name"); + if (name == null) { + // TODO Remove once alert attribute is no longer supported. + name = apiResponseSet.getStringValue("alert"); + } + this.name = name; + this.description = apiResponseSet.getStringValue("description"); + this.risk = stringToRisk(apiResponseSet.getStringValue("risk")); + this.confidence = stringToConfidence(apiResponseSet.getStringValue("confidence")); + this.url = apiResponseSet.getStringValue("url"); + this.other = apiResponseSet.getStringValue("other"); + this.param = apiResponseSet.getStringValue("param"); + this.attack = apiResponseSet.getStringValue("attack"); + this.evidence = apiResponseSet.getStringValue("evidence"); + this.reference = apiResponseSet.getStringValue("reference"); + this.cweId = stringToInt(apiResponseSet.getStringValue("cweid"), 0); + this.wascId = stringToInt(apiResponseSet.getStringValue("wascid"), 0); + this.solution = apiResponseSet.getStringValue("solution"); + this.messageId = apiResponseSet.getStringValue("messageId"); + } + + public Alert(String name, String url, String riskStr, String confidenceStr, + String param, String other) { + super(); + this.name = name; + this.url = url; + this.other = other; + this.param = param; + this.risk = stringToRisk(riskStr); + this.confidence = stringToConfidence(confidenceStr); + } + + public Alert(String name, String url, Risk risk, Confidence confidence, + String param, String other, String attack, String description, String reference, String solution, + String evidence, int cweId, int wascId) { + super(); + this.name = name; + this.risk = risk; + this.confidence = confidence; + this.url = url; + this.other = other; + this.param = param; + this.attack = attack; + this.description = description; + this.reference = reference; + this.solution = solution; + this.evidence = evidence; + this.cweId = cweId; + this.wascId = wascId; + } + + public Alert(String name, String url, Risk risk, Confidence confidence, + String param, String other) { + super(); + this.name = name; + this.risk = risk; + this.confidence = confidence; + this.url = url; + this.other = other; + this.param = param; + } + + public Alert(String name, String url, Risk risk, Confidence confidence) { + super(); + this.name = name; + this.risk = risk; + this.confidence = confidence; + this.url = url; + } + + public Alert(String name, String url) { + super(); + this.name = name; + this.url = url; + } + + /** + * Converts the given {@code string} to an {@code int}. + *

+ * If the given {@code string} is {@code null} or not a valid {@code int}, the default value is returned. + * + * @param string the string to be converted to {@code int}. + * @param defaultValue the value to return in case the {@code string} is {@code null} or not an {@code int}. + * @return the {@code int} converted from the {@code string}, or the default value if {@code string} is {@code null} or not + * an {@code int}. + */ + private static int stringToInt(String string, int defaultValue) { + if (string == null) { + return defaultValue; + } + try { + return Integer.parseInt(string); + } catch (NumberFormatException e) { + // Ignore. + } + return defaultValue; + } + + /** + * Converts the given {@code string} to a {@link Risk} value. + * + * @param string the string to be converted to a {@link Risk} value. + * @return the {@code Risk} value converted from the {@code string}, or null if {@code string} is {@code null}. + */ + private static Risk stringToRisk(String string) { + if (string == null) { + return null; + } + return Risk.valueOf(string); + } + + /** + * Converts the given {@code string} to a {@link Confidence} value. + * + * @param string the string to be converted to a {@link Confidence} value. + * @return the {@code Confidence} value converted from the {@code string}, or null if {@code string} is {@code null}. + */ + private static Confidence stringToConfidence(String string) { + if (string == null) { + return null; + } + if ("False Positive".equalsIgnoreCase(string)) { + return Confidence.FalsePositive; + } + return Confidence.valueOf(string); + } + + /** + * Gets the ID of the alert. + * + * @return the ID of the alert. + * @since 1.1.0 + */ + public String getId() { + return id; + } + + /** + * Gets the ID of the plugin/scanner that raised the alert. + * + * @return the ID of the plugin/scanner that raised the alert. + * @since 1.1.0 + */ + public String getPluginId() { + return pluginId; + } + + /** + * Gets the ID of the HTTP message of the alert. + * + * @return the ID of the HTTP message. + * @since 1.1.0 + */ + public String getMessageId() { + return messageId; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since 1.1.0 + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since 1.1.0 + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (1.1.0) Use {@link #getName()} instead. + */ + @Deprecated + public String getAlert() { + return name; + } + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (1.1.0) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; + } + public Risk getRisk() { + return risk; + } + public void setRisk(Risk risk) { + this.risk = risk; + } + public void setRisk(String risk) { + this.risk = Risk.valueOf(risk); + } + /** + * @deprecated + * {@link #getConfidence()} + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + public Reliability getReliability() { + return reliability; + } + /** + * @deprecated + * {@link #setConfidence(Confidence)} + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + public void setReliability(Reliability reliability) { + this.reliability = reliability; + } + /** + * @deprecated + * {@link #setConfidence(String)} + * Use of reliability has been deprecated in favour of using confidence + */ + @Deprecated + public void setReliability(String reliability) { + this.reliability = Reliability.valueOf(reliability); + } + public Confidence getConfidence() { + return confidence; + } + public void setConfidence(Confidence confidence) { + this.confidence = confidence; + } + public void setConfidence(String confidence) { + this.confidence = Confidence.valueOf(confidence); + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getOther() { + return other; + } + public void setOther(String other) { + this.other = other; + } + public String getParam() { + return param; + } + public void setParam(String param) { + this.param = param; + } + + public String getAttack() { + return attack; + } + + public String getDescription() { + return description; + } + + public String getReference() { + return reference; + } + + public String getSolution() { + return solution; + } + + public String getEvidence() { + return evidence; + } + + public int getCweId() { + return cweId; + } + + public int getWascId() { + return wascId; + } + + public boolean matches (Alert alertFilter) { + boolean matches = true; + if (alertFilter.getName() != null && ! alertFilter.getName().equals(name) ) { + matches = false; + } + if (alertFilter.getRisk() != null && ! alertFilter.getRisk().equals(risk) ) { + matches = false; + } + if (alertFilter.getConfidence() != null && ! alertFilter.getConfidence().equals(confidence) ) { + matches = false; + } + + return matches; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((attack == null) ? 0 : attack.hashCode()); + result = prime * result + cweId; + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((evidence == null) ? 0 : evidence.hashCode()); + result = prime * result + ((other == null) ? 0 : other.hashCode()); + result = prime * result + ((param == null) ? 0 : param.hashCode()); + result = prime * result + ((reference == null) ? 0 : reference.hashCode()); + result = prime * result + ((confidence == null) ? 0 : confidence.hashCode()); + result = prime * result + ((risk == null) ? 0 : risk.hashCode()); + result = prime * result + ((solution == null) ? 0 : solution.hashCode()); + result = prime * result + ((url == null) ? 0 : url.hashCode()); + result = prime * result + wascId; + return result; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object == null) { + return false; + } + if (getClass() != object.getClass()) { + return false; + } + Alert otherAlert = (Alert) object; + if (name == null) { + if (otherAlert.name != null) { + return false; + } + } else if (!name.equals(otherAlert.name)) { + return false; + } + if (attack == null) { + if (otherAlert.attack != null) { + return false; + } + } else if (!attack.equals(otherAlert.attack)) { + return false; + } + if (cweId != otherAlert.cweId) { + return false; + } + if (description == null) { + if (otherAlert.description != null) { + return false; + } + } else if (!description.equals(otherAlert.description)) { + return false; + } + if (evidence == null) { + if (otherAlert.evidence != null) { + return false; + } + } else if (!evidence.equals(otherAlert.evidence)) { + return false; + } + if (this.other == null) { + if (otherAlert.other != null) { + return false; + } + } else if (!this.other.equals(otherAlert.other)) { + return false; + } + if (param == null) { + if (otherAlert.param != null) { + return false; + } + } else if (!param.equals(otherAlert.param)) { + return false; + } + if (reference == null) { + if (otherAlert.reference != null) { + return false; + } + } else if (!reference.equals(otherAlert.reference)) { + return false; + } + if (confidence != otherAlert.confidence) { + return false; + } + if (risk != otherAlert.risk) { + return false; + } + if (solution == null) { + if (otherAlert.solution != null) { + return false; + } + } else if (!solution.equals(otherAlert.solution)) { + return false; + } + if (url == null) { + if (otherAlert.url != null) { + return false; + } + } else if (!url.equals(otherAlert.url)) { + return false; + } + if (wascId != otherAlert.wascId) { + return false; + } + return true; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("\tAlert: ").append(getAlert()).append(", "); + sb.append("Risk: "); + if (getRisk() != null) { + sb.append(getRisk().name()); + } else { + sb.append("null"); + } + sb.append(", "); + sb.append("Confidence: "); + if (getConfidence() != null) { + sb.append(getConfidence().name()); + } else { + sb.append("null"); + } + sb.append(", "); + sb.append("Url: ").append(getUrl()).append(", "); + sb.append("Param: ").append(getParam()).append(", "); + sb.append("Other: ").append(getOther()); + return sb.toString(); + } + +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index 7374618..026e66b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -1,115 +1,115 @@ -package org.zaproxy.clientapi.core; - -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.JDOMException; -import org.jdom.input.SAXBuilder; -import org.jdom.output.Format; -import org.jdom.output.XMLOutputter; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class AlertsFile { - public static void saveAlertsToFile(List requireAlerts, List reportAlerts, List ignoredAlerts, File outputFile) throws JDOMException, IOException { - Element alerts = new Element("alerts"); - Document alertsDocument = new Document(alerts); - alertsDocument.setRootElement(alerts); - if (reportAlerts.size() > 0){ - Element alertsFound = new Element("alertsFound"); - alertsFound.setAttribute("alertsFound", Integer.toString(reportAlerts.size())); - for (Alert alert : reportAlerts){ - createAlertXMLElements(alertsFound, alert); - } - alertsDocument.getRootElement().addContent(alertsFound); - } - - if (requireAlerts.size() > 0){ - Element alertsNotFound = new Element("alertsNotFound"); - alertsNotFound.setAttribute("alertsNotFound", Integer.toString(requireAlerts.size())); - for (Alert alert : requireAlerts){ - createAlertXMLElements(alertsNotFound, alert); - } - alertsDocument.getRootElement().addContent(alertsNotFound); - } - - if (ignoredAlerts.size() > 0){ - Element ignoredAlertsFound = new Element("ignoredAlertsFound"); - ignoredAlertsFound.setAttribute("ignoredAlertsFound", Integer.toString(ignoredAlerts.size())); - for (Alert alert : ignoredAlerts){ - createAlertXMLElements(ignoredAlertsFound, alert); - } - alertsDocument.getRootElement().addContent(ignoredAlertsFound); - } - - writeAlertsToFile(outputFile, alertsDocument); - } - - private static void writeAlertsToFile(File outputFile, Document doc) { - - XMLOutputter xmlOutput = new XMLOutputter(); - - xmlOutput.setFormat(Format.getPrettyFormat()); - try { - xmlOutput.output(doc, new FileWriter(outputFile)); - System.out.println("alert xml report saved to: "+outputFile.getAbsolutePath()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static void createAlertXMLElements(Element alertsFound, Alert alert) { - Element alertElement = new Element("alert"); - if (alert.getName() != null) { - alertElement.setAttribute("name", alert.getName()); - // TODO Remove once alert attribute is no longer supported. - alertElement.setAttribute("alert", alert.getName()); - } - if (alert.getRisk() != null) - alertElement.setAttribute("risk", alert.getRisk().name()); - if (alert.getUrl() != null) - alertElement.setAttribute("confidence", alert.getConfidence().name()); - if (alert.getUrl() != null) - alertElement.setAttribute("url", alert.getUrl()); - if (alert.getParam() != null) - alertElement.setAttribute("param", alert.getParam()); - if (alert.getOther() != null) - alertElement.setAttribute("other", alert.getOther()); - if (alert.getAttack() != null) - alertElement.setAttribute("attack", alert.getAttack()); - if (alert.getDescription() != null) - alertElement.setAttribute("description", alert.getDescription()); - if (alert.getSolution() != null) - alertElement.setAttribute("solution", alert.getSolution()); - if (alert.getReference() != null) - alertElement.setAttribute("reference", alert.getReference()); - alertsFound.addContent(alertElement); - } - - public static List getAlertsFromFile(File file, String alertType) throws JDOMException, IOException { - List alerts = new ArrayList<>(); - SAXBuilder parser = new SAXBuilder(); - Document alertsDoc = parser.build(file); - @SuppressWarnings("unchecked") - List alertElements = alertsDoc.getRootElement().getChildren(alertType); - for (Element element: alertElements){ - String name = element.getAttributeValue("name"); - if (name == null) { - // TODO Remove once alert attribute is no longer supported. - name = element.getAttributeValue("alert"); - } - Alert alert = new Alert( - name, - element.getAttributeValue("url"), - element.getAttributeValue("risk"), - element.getAttributeValue("confidence"), - element.getAttributeValue("param"), - element.getAttributeValue("other")); - alerts.add(alert); - } - return alerts; - } -} +package org.zaproxy.clientapi.core; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.JDOMException; +import org.jdom.input.SAXBuilder; +import org.jdom.output.Format; +import org.jdom.output.XMLOutputter; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class AlertsFile { + public static void saveAlertsToFile(List requireAlerts, List reportAlerts, List ignoredAlerts, File outputFile) throws JDOMException, IOException { + Element alerts = new Element("alerts"); + Document alertsDocument = new Document(alerts); + alertsDocument.setRootElement(alerts); + if (reportAlerts.size() > 0){ + Element alertsFound = new Element("alertsFound"); + alertsFound.setAttribute("alertsFound", Integer.toString(reportAlerts.size())); + for (Alert alert : reportAlerts){ + createAlertXMLElements(alertsFound, alert); + } + alertsDocument.getRootElement().addContent(alertsFound); + } + + if (requireAlerts.size() > 0){ + Element alertsNotFound = new Element("alertsNotFound"); + alertsNotFound.setAttribute("alertsNotFound", Integer.toString(requireAlerts.size())); + for (Alert alert : requireAlerts){ + createAlertXMLElements(alertsNotFound, alert); + } + alertsDocument.getRootElement().addContent(alertsNotFound); + } + + if (ignoredAlerts.size() > 0){ + Element ignoredAlertsFound = new Element("ignoredAlertsFound"); + ignoredAlertsFound.setAttribute("ignoredAlertsFound", Integer.toString(ignoredAlerts.size())); + for (Alert alert : ignoredAlerts){ + createAlertXMLElements(ignoredAlertsFound, alert); + } + alertsDocument.getRootElement().addContent(ignoredAlertsFound); + } + + writeAlertsToFile(outputFile, alertsDocument); + } + + private static void writeAlertsToFile(File outputFile, Document doc) { + + XMLOutputter xmlOutput = new XMLOutputter(); + + xmlOutput.setFormat(Format.getPrettyFormat()); + try { + xmlOutput.output(doc, new FileWriter(outputFile)); + System.out.println("alert xml report saved to: "+outputFile.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void createAlertXMLElements(Element alertsFound, Alert alert) { + Element alertElement = new Element("alert"); + if (alert.getName() != null) { + alertElement.setAttribute("name", alert.getName()); + // TODO Remove once alert attribute is no longer supported. + alertElement.setAttribute("alert", alert.getName()); + } + if (alert.getRisk() != null) + alertElement.setAttribute("risk", alert.getRisk().name()); + if (alert.getUrl() != null) + alertElement.setAttribute("confidence", alert.getConfidence().name()); + if (alert.getUrl() != null) + alertElement.setAttribute("url", alert.getUrl()); + if (alert.getParam() != null) + alertElement.setAttribute("param", alert.getParam()); + if (alert.getOther() != null) + alertElement.setAttribute("other", alert.getOther()); + if (alert.getAttack() != null) + alertElement.setAttribute("attack", alert.getAttack()); + if (alert.getDescription() != null) + alertElement.setAttribute("description", alert.getDescription()); + if (alert.getSolution() != null) + alertElement.setAttribute("solution", alert.getSolution()); + if (alert.getReference() != null) + alertElement.setAttribute("reference", alert.getReference()); + alertsFound.addContent(alertElement); + } + + public static List getAlertsFromFile(File file, String alertType) throws JDOMException, IOException { + List alerts = new ArrayList<>(); + SAXBuilder parser = new SAXBuilder(); + Document alertsDoc = parser.build(file); + @SuppressWarnings("unchecked") + List alertElements = alertsDoc.getRootElement().getChildren(alertType); + for (Element element: alertElements){ + String name = element.getAttributeValue("name"); + if (name == null) { + // TODO Remove once alert attribute is no longer supported. + name = element.getAttributeValue("alert"); + } + Alert alert = new Alert( + name, + element.getAttributeValue("url"), + element.getAttributeValue("risk"), + element.getAttributeValue("confidence"), + element.getAttributeValue("param"), + element.getAttributeValue("other")); + alerts.add(alert); + } + return alerts; + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 4b2862b..f878483 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -1,690 +1,690 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.core; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.Socket; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.TimeUnit; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.zaproxy.clientapi.gen.Acsrf; -import org.zaproxy.clientapi.gen.AjaxSpider; -import org.zaproxy.clientapi.gen.AlertFilter; -import org.zaproxy.clientapi.gen.Ascan; -import org.zaproxy.clientapi.gen.Authentication; -import org.zaproxy.clientapi.gen.Authorization; -import org.zaproxy.clientapi.gen.Autoupdate; -import org.zaproxy.clientapi.gen.Break; -import org.zaproxy.clientapi.gen.Context; -import org.zaproxy.clientapi.gen.Core; -import org.zaproxy.clientapi.gen.ForcedUser; -import org.zaproxy.clientapi.gen.HttpSessions; -import org.zaproxy.clientapi.gen.ImportLogFiles; -import org.zaproxy.clientapi.gen.Importurls; -import org.zaproxy.clientapi.gen.Openapi; -import org.zaproxy.clientapi.gen.Params; -import org.zaproxy.clientapi.gen.Pnh; -import org.zaproxy.clientapi.gen.Pscan; -import org.zaproxy.clientapi.gen.Replacer; -import org.zaproxy.clientapi.gen.Reveal; -import org.zaproxy.clientapi.gen.Script; -import org.zaproxy.clientapi.gen.Search; -import org.zaproxy.clientapi.gen.Selenium; -import org.zaproxy.clientapi.gen.SessionManagement; -import org.zaproxy.clientapi.gen.Spider; -import org.zaproxy.clientapi.gen.Stats; -import org.zaproxy.clientapi.gen.Users; - -public class ClientApi { - - private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; - - private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; - private static final String ZAP_API_KEY_PARAM = "apikey"; - - private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); - private boolean debug = false; - private PrintStream debugStream = System.out; - - private final String zapAddress; - private final int zapPort; - - private final String apiKey; - - // Note that any new API implementations added have to be added here manually - public Acsrf acsrf = new Acsrf(this); - public AjaxSpider ajaxSpider = new AjaxSpider(this); - public AlertFilter alertFilter = new AlertFilter(this); - public Ascan ascan = new Ascan(this); - public Authentication authentication = new Authentication(this); - public Authorization authorization = new Authorization(this); - public Autoupdate autoupdate = new Autoupdate(this); - public Break brk = new Break(this); - public Context context = new Context(this); - public Core core = new Core(this); - public ForcedUser forcedUser = new ForcedUser(this); - public HttpSessions httpSessions = new HttpSessions(this); - public ImportLogFiles logImportFiles = new ImportLogFiles(this); - public Importurls importurls = new Importurls(this); - public Openapi openapi = new Openapi(this); - public Params params = new Params(this); - public Pnh pnh = new Pnh(this); - public Pscan pscan = new Pscan(this); - public Replacer replacer = new Replacer(this); - public Reveal reveal = new Reveal(this); - public Search search = new Search(this); - public Script script = new Script(this); - public Selenium selenium = new Selenium(this); - public SessionManagement sessionManagement = new SessionManagement(this); - public Spider spider = new Spider(this); - public Stats stats = new Stats(this); - public Users users = new Users(this); - - public ClientApi (String zapAddress, int zapPort) { - this(zapAddress, zapPort, false); - } - - /** - * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API - * requests. - * - * @param zapAddress ZAP's address - * @param zapPort ZAP's listening port - * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. - * @since 1.1.0 - */ - public ClientApi(String zapAddress, int zapPort, String apiKey) { - this(zapAddress, zapPort, apiKey, false); - } - - public ClientApi (String zapAddress, int zapPort, boolean debug) { - this(zapAddress, zapPort, null, debug); - } - - /** - * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API - * requests. Also, sets whether or not client API debug information should be written to the - * {@link #setDebugStream(PrintStream) debug stream} (by default the standard output stream). - * - * @param zapAddress ZAP's address - * @param zapPort ZAP's listening port - * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. - * @param debug {@code true} if debug information should be written to debug stream, {@code false} otherwise. - * @since 1.1.0 - */ - public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { - proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); - this.debug = debug; - this.zapAddress = zapAddress; - this.zapPort = zapPort; - this.apiKey = apiKey; - } - - public void setDebugStream(PrintStream debugStream) { - this.debugStream = debugStream; - } - - public void accessUrl (String url) throws ClientApiException { - accessUrlViaProxy(proxy, url); - } - - private int statusToInt(ApiResponse response) { - return Integer.parseInt(((ApiResponseElement)response).getValue()); - } - - public void checkAlerts (List ignoreAlerts, List requireAlerts) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); - verifyAlerts(results.get("requireAlerts"), results.get("reportAlerts")); - } - - private void verifyAlerts(List requireAlerts, List reportAlerts) throws ClientApiException { - StringBuilder sb = new StringBuilder(); - if (reportAlerts.size() > 0) { - sb.append("Found ").append(reportAlerts.size()).append(" alerts\n"); - for (Alert alert: reportAlerts) { - sb.append('\t'); - sb.append(alert.toString()); - sb.append('\n'); - } - } - if (requireAlerts != null && requireAlerts.size() > 0) { - if (sb.length() > 0) { - sb.append('\n'); - } - sb.append("Not found ").append(requireAlerts.size()).append(" alerts\n"); - for (Alert alert: requireAlerts) { - sb.append('\t'); - sb.append(alert.toString()); - sb.append('\n'); - } - } - if (sb.length() > 0) { - if (debug) { - debugStream.println("Failed: " + sb.toString()); - } - throw new ClientApiException (sb.toString()); - } - } - - public void checkAlerts(List ignoreAlerts, List requireAlerts, File outputFile) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); - int alertsFound = results.get("reportAlerts").size(); - int alertsNotFound = results.get("requireAlerts").size(); - int alertsIgnored = results.get("ignoredAlerts").size(); - String resultsString = String.format("Alerts Found: %d, Alerts required but not found: %d, Alerts ignored: %d", alertsFound, alertsNotFound, alertsIgnored); - try { - AlertsFile.saveAlertsToFile(results.get("requireAlerts"), results.get("reportAlerts"), results.get("ignoredAlerts"), outputFile); - } catch (Exception e) { - throw new ClientApiException (e); - } - if (alertsFound>0 || alertsNotFound>0){ - throw new ClientApiException("Check Alerts Failed!\n"+resultsString); - }else{ - if (debug) { - debugStream.println("Check Alerts Passed!\n" + resultsString); - } - } - } - - public List getAlerts(String baseUrl, int start, int count) throws ClientApiException { - List alerts = new ArrayList(); - ApiResponse response = core.alerts(baseUrl, String.valueOf(start), String.valueOf(count)); - if (response != null && response instanceof ApiResponseList) { - ApiResponseList alertList = (ApiResponseList)response; - for (ApiResponse resp : alertList.getItems()) { - alerts.add(new Alert((ApiResponseSet) resp)); - } - } - return alerts; - } - - private HashMap> checkForAlerts(List ignoreAlerts, List requireAlerts) throws ClientApiException { - List reportAlerts = new ArrayList<>(); - List ignoredAlerts = new ArrayList<>(); - List alerts = getAlerts(null, -1, -1); - for (Alert alert : alerts) { - boolean ignore = false; - if (ignoreAlerts != null) { - for (Alert ignoreAlert : ignoreAlerts) { - if (alert.matches(ignoreAlert)) { - if (debug) { - debugStream.println("Ignoring alert " + ignoreAlert); - } - ignoredAlerts.add(alert); - ignore = true; - break; - } - } - } - if (! ignore) { - reportAlerts.add(alert); - } - if (requireAlerts != null) { - for (Alert requireAlert : requireAlerts) { - if (alert.matches(requireAlert)) { - if (debug) { - debugStream.println("Found alert " + alert); - } - requireAlerts.remove(requireAlert); - // Remove it from the not-ignored list as well - reportAlerts.remove(alert); - break; - } - } - } - } - HashMap> results = new HashMap<>(); - results.put("reportAlerts", reportAlerts); - results.put("requireAlerts", requireAlerts); - results.put("ignoredAlerts", ignoredAlerts); - return results; - } - - private void accessUrlViaProxy (Proxy proxy, String apiurl) throws ClientApiException { - try { - URL url = new URL(apiurl); - if (debug) { - debugStream.println("Open URL: " + apiurl); - } - HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy); - uc.connect(); - - BufferedReader in; - try { - in = new BufferedReader(new InputStreamReader(uc.getInputStream())); - String inputLine; - - while ((inputLine = in.readLine()) != null) { - if (debug) { - debugStream.println(inputLine); - } - } - in.close(); - - } catch (IOException e) { - // Ignore - if (debug) { - debugStream.println("Ignoring exception " + e); - } - } - } catch (Exception e) { - throw new ClientApiException (e); - } - } - - public ApiResponse callApi (String component, String type, String method, - Map params) throws ClientApiException { - Document dom = this.callApiDom(component, type, method, params); - return ApiResponseFactory.getResponse(dom.getFirstChild()); - } - - private Document callApiDom (String component, String type, String method, - Map params) throws ClientApiException { - try { - HttpRequest request = buildZapRequest("xml", component, type, method, params); - if (debug) { - debugStream.println("Open URL: " + request.getRequestUri()); - } - //get the factory - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - //Using factory get an instance of document builder - DocumentBuilder db = dbf.newDocumentBuilder(); - //parse using builder to get DOM representation of the XML file - return db.parse(getConnectionInputStream(request)); - } catch (Exception e) { - throw new ClientApiException(e); - } - } - - private InputStream getConnectionInputStream(HttpRequest request) throws IOException { - HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); - for (Entry header : request.getHeaders().entrySet()) { - uc.setRequestProperty(header.getKey(), header.getValue()); - } - uc.connect(); - if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { - return uc.getErrorStream(); - } - return uc.getInputStream(); - } - - public byte[] callApiOther (String component, String type, String method, - Map params) throws ClientApiException { - try { - HttpRequest request = buildZapRequest("other", component, type, method, params); - if (debug) { - debugStream.println("Open URL: " + request.getRequestUri()); - } - InputStream in = getConnectionInputStream(request); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buffer = new byte[8 * 1024]; - try { - int bytesRead; - while ((bytesRead = in.read(buffer)) != -1) { - out.write(buffer, 0, bytesRead); - } - } finally { - out.close(); - in.close(); - } - return out.toByteArray(); - - } catch (Exception e) { - throw new ClientApiException(e); - } - } - - private HttpRequest buildZapRequest( - String format, - String component, - String type, - String method, - Map params) throws MalformedURLException { - StringBuilder sb = new StringBuilder(); - sb.append("http://zap/"); - sb.append(format); - sb.append('/'); - sb.append(component); - sb.append('/'); - sb.append(type); - sb.append('/'); - sb.append(method); - sb.append('/'); - if (params != null) { - if (apiKey != null && !apiKey.isEmpty()) { - params.put(ZAP_API_KEY_PARAM, apiKey); - } - - sb.append('?'); - for (Map.Entry p : params.entrySet()) { - sb.append(encodeQueryParam(p.getKey())); - sb.append('='); - if (p.getValue() != null) { - sb.append(encodeQueryParam(p.getValue())); - } - sb.append('&'); - } - } else if (apiKey != null && !apiKey.isEmpty()) { - // Send the API key even if there are no parameters, - // older ZAP versions might need it as (query) parameter. - sb.append('?'); - sb.append(encodeQueryParam(ZAP_API_KEY_PARAM)); - sb.append('='); - sb.append(encodeQueryParam(apiKey)); - } - - HttpRequest request = new HttpRequest(new URL(sb.toString())); - if (apiKey != null && !apiKey.isEmpty()) { - request.addHeader(ZAP_API_KEY_HEADER, apiKey); - } - return request; - } - - private static String encodeQueryParam(String param) { - try { - return URLEncoder.encode(param, "UTF-8"); - } catch (UnsupportedEncodingException ignore) { - // UTF-8 is a standard charset. - } - return param; - } - - /** - * Adds the given regular expression to the exclusion list of the given context. - * - * @param apikey the API key, might be {@code null}. - * @param contextName the name of the context. - * @param regex the regular expression to add. - * @throws Exception if an error occurred while calling the API. - * @deprecated (1.1.0) Use {@link Context#excludeFromContext(String, String)} instead. - * @see #context - */ - @Deprecated - public void addExcludeFromContext(String apikey, String contextName, String regex) throws Exception { - context.excludeFromContext(apikey, contextName, regex); - } - - /** - * Adds the given regular expression to the inclusion list of the given context. - * - * @param apikey the API key, might be {@code null}. - * @param contextName the name of the context. - * @param regex the regular expression to add. - * @throws Exception if an error occurred while calling the API. - * @deprecated (1.1.0) Use {@link Context#includeInContext(String, String)} instead. - * @see #context - */ - @Deprecated - public void addIncludeInContext(String apikey, String contextName, String regex) throws Exception { - context.includeInContext(apikey, contextName, regex); - } - - /** - * Includes just one of the nodes that match the given regular expression in the context with the given name. - *

- * Nodes that do not match the regular expression are excluded. - * - * @param apikey the API key, might be {@code null}. - * @param contextName the name of the context. - * @param regex the regular expression to match the node/URL. - * @throws Exception if an error occurred while calling the API. - * @deprecated (1.1.0) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. - */ - @Deprecated - public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) throws Exception { - List sessionUrls = getSessionUrls(); - boolean foundOneMatch = false; - for (String sessionUrl : sessionUrls){ - if (sessionUrl.matches(regex)){ - if (foundOneMatch){ - addExcludeFromContext(apikey, contextName, sessionUrl); - } else { - foundOneMatch = true; - } - } - } - if(!foundOneMatch){ - throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); - } - - } - - /** - * Includes just one of the nodes that match the given regular expression in the context with the given name. - *

- * Nodes that do not match the regular expression are excluded. - * - * @param contextName the name of the context. - * @param regex the regular expression to match the node/URL. - * @throws Exception if an error occurred while calling the API. - */ - public void includeOneMatchingNodeInContext(String contextName, String regex) throws Exception { - List sessionUrls = getSessionUrls(); - boolean foundOneMatch = false; - for (String sessionUrl : sessionUrls) { - if (sessionUrl.matches(regex)) { - if (foundOneMatch) { - context.excludeFromContext(contextName, regex); - } else { - foundOneMatch = true; - } - } - } - if (!foundOneMatch) { - throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); - } - } - - private List getSessionUrls() throws Exception { - List sessionUrls = new ArrayList<>(); - ApiResponse response = core.urls(); - if (response != null && response instanceof ApiResponseList) { - ApiResponseElement urlList = (ApiResponseElement) ((ApiResponseList) response).getItems().get(0); - for (ApiResponse element: ((ApiResponseList) response).getItems()){ - URL url = new URL(((ApiResponseElement)element).getValue()); - sessionUrls.add(url.getProtocol()+"://"+url.getHost()+url.getPath()); - } - System.out.println(urlList); - } - return sessionUrls; - } - - /** - * Active scans the given site, that's in scope. - *

- * The method returns only after the scan has finished. - * - * @param apikey the API key, might be {@code null}. - * @param url the site to scan - * @throws Exception if an error occurred while calling the API. - * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of - * the {@code ClientApi} constructors. - */ - @Deprecated - public void activeScanSiteInScope(String apikey, String url) throws Exception { - ascan.scan(apikey, url, "true", "true", "", "", ""); - waitForAScanToFinish(url); - } - - /** - * Active scans the given site, that's in scope. - *

- * The method returns only after the scan has finished. - * - * @param url the site to scan - * @throws Exception if an error occurred while calling the API. - * @since 1.1.0 - */ - public void activeScanSiteInScope(String url) throws Exception { - ascan.scan(url, "true", "true", "", "", ""); - waitForAScanToFinish(url); - } - - private void waitForAScanToFinish(String targetUrl) throws ClientApiException { - // Poll until spider finished - int status = 0; - while ( status < 100) { - status = statusToInt(ascan.status("")); - if(debug){ - String format = "Scanning %s Progress: %d%%"; - System.out.println(String.format(format, targetUrl, status)); - }try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // Ignore - } - } - } - - /** - * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. - *

- * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not - * successful. The connection attempts might be polled in one second interval. - * - * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start - * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting - * @see #waitForSuccessfulConnectionToZap(int, int) - */ - public void waitForSuccessfulConnectionToZap(int timeoutInSeconds) throws ClientApiException { - waitForSuccessfulConnectionToZap(timeoutInSeconds, DEFAULT_CONNECTION_POOLING_IN_MS); - } - - /** - * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. - *

- * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not - * successful. The connection attempts are done with the given polling interval. - * - * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start - * @param pollingIntervalInMs the interval, in milliseconds, for connection polling - * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting. - * @throws IllegalArgumentException if the interval for connection polling is negative. - * @see #waitForSuccessfulConnectionToZap(int) - */ - public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIntervalInMs) throws ClientApiException { - int timeoutInMs = (int) TimeUnit.SECONDS.toMillis(timeoutInSeconds); - int connectionTimeoutInMs = timeoutInMs; - boolean connectionSuccessful = false; - long startTime = System.currentTimeMillis(); - do { - try (Socket socket = new Socket()) { - try { - socket.connect(new InetSocketAddress(zapAddress, zapPort), connectionTimeoutInMs); - connectionSuccessful = true; - } catch (SocketTimeoutException ignore) { - throw newTimeoutConnectionToZap(timeoutInSeconds); - } catch (IOException ignore) { - // and keep trying but wait some time first... - try { - Thread.sleep(pollingIntervalInMs); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new ClientApiException( - "The ClientApi was interrupted while sleeping between connection polling.", - e); - } - - long ellapsedTime = System.currentTimeMillis() - startTime; - if (ellapsedTime >= timeoutInMs) { - throw newTimeoutConnectionToZap(timeoutInSeconds); - } - connectionTimeoutInMs = (int) (timeoutInMs - ellapsedTime); - } - } catch (IOException ignore) { - // the closing state doesn't matter. - } - } while (!connectionSuccessful); - } - - private static ClientApiException newTimeoutConnectionToZap(int timeoutInSeconds) { - return new ClientApiException("Unable to connect to ZAP's proxy after " + timeoutInSeconds + " seconds."); - } - - /** - * A simple HTTP request. - *

- * Contains the request URI and headers. - */ - private static class HttpRequest { - - private final URL requestUri; - private final Map headers; - - public HttpRequest(URL url) { - this.requestUri = url; - this.headers = new HashMap<>(); - } - - /** - * Gets the request URI of the request. - * - * @return the request URI. - */ - public URL getRequestUri() { - return requestUri; - } - - /** - * Adds a header with the given name and value. - *

- * If a header with the given name already exists it is replaced with the new value. - * - * @param name the name of the header. - * @param value the value of the header. - */ - public void addHeader(String name, String value) { - headers.put(name, value); - } - - /** - * Gets the headers of the HTTP request. An unmodifiable {@code Map} containing the headers (the keys correspond to the - * header names and the values for its contents). - * - * @return an unmodifiable {@code Map} containing the headers. - */ - public Map getHeaders() { - return Collections.unmodifiableMap(headers); - } - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.core; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.MalformedURLException; +import java.net.Proxy; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.zaproxy.clientapi.gen.Acsrf; +import org.zaproxy.clientapi.gen.AjaxSpider; +import org.zaproxy.clientapi.gen.AlertFilter; +import org.zaproxy.clientapi.gen.Ascan; +import org.zaproxy.clientapi.gen.Authentication; +import org.zaproxy.clientapi.gen.Authorization; +import org.zaproxy.clientapi.gen.Autoupdate; +import org.zaproxy.clientapi.gen.Break; +import org.zaproxy.clientapi.gen.Context; +import org.zaproxy.clientapi.gen.Core; +import org.zaproxy.clientapi.gen.ForcedUser; +import org.zaproxy.clientapi.gen.HttpSessions; +import org.zaproxy.clientapi.gen.ImportLogFiles; +import org.zaproxy.clientapi.gen.Importurls; +import org.zaproxy.clientapi.gen.Openapi; +import org.zaproxy.clientapi.gen.Params; +import org.zaproxy.clientapi.gen.Pnh; +import org.zaproxy.clientapi.gen.Pscan; +import org.zaproxy.clientapi.gen.Replacer; +import org.zaproxy.clientapi.gen.Reveal; +import org.zaproxy.clientapi.gen.Script; +import org.zaproxy.clientapi.gen.Search; +import org.zaproxy.clientapi.gen.Selenium; +import org.zaproxy.clientapi.gen.SessionManagement; +import org.zaproxy.clientapi.gen.Spider; +import org.zaproxy.clientapi.gen.Stats; +import org.zaproxy.clientapi.gen.Users; + +public class ClientApi { + + private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; + + private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; + private static final String ZAP_API_KEY_PARAM = "apikey"; + + private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); + private boolean debug = false; + private PrintStream debugStream = System.out; + + private final String zapAddress; + private final int zapPort; + + private final String apiKey; + + // Note that any new API implementations added have to be added here manually + public Acsrf acsrf = new Acsrf(this); + public AjaxSpider ajaxSpider = new AjaxSpider(this); + public AlertFilter alertFilter = new AlertFilter(this); + public Ascan ascan = new Ascan(this); + public Authentication authentication = new Authentication(this); + public Authorization authorization = new Authorization(this); + public Autoupdate autoupdate = new Autoupdate(this); + public Break brk = new Break(this); + public Context context = new Context(this); + public Core core = new Core(this); + public ForcedUser forcedUser = new ForcedUser(this); + public HttpSessions httpSessions = new HttpSessions(this); + public ImportLogFiles logImportFiles = new ImportLogFiles(this); + public Importurls importurls = new Importurls(this); + public Openapi openapi = new Openapi(this); + public Params params = new Params(this); + public Pnh pnh = new Pnh(this); + public Pscan pscan = new Pscan(this); + public Replacer replacer = new Replacer(this); + public Reveal reveal = new Reveal(this); + public Search search = new Search(this); + public Script script = new Script(this); + public Selenium selenium = new Selenium(this); + public SessionManagement sessionManagement = new SessionManagement(this); + public Spider spider = new Spider(this); + public Stats stats = new Stats(this); + public Users users = new Users(this); + + public ClientApi (String zapAddress, int zapPort) { + this(zapAddress, zapPort, false); + } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API + * requests. + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @since 1.1.0 + */ + public ClientApi(String zapAddress, int zapPort, String apiKey) { + this(zapAddress, zapPort, apiKey, false); + } + + public ClientApi (String zapAddress, int zapPort, boolean debug) { + this(zapAddress, zapPort, null, debug); + } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API + * requests. Also, sets whether or not client API debug information should be written to the + * {@link #setDebugStream(PrintStream) debug stream} (by default the standard output stream). + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @param debug {@code true} if debug information should be written to debug stream, {@code false} otherwise. + * @since 1.1.0 + */ + public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { + proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); + this.debug = debug; + this.zapAddress = zapAddress; + this.zapPort = zapPort; + this.apiKey = apiKey; + } + + public void setDebugStream(PrintStream debugStream) { + this.debugStream = debugStream; + } + + public void accessUrl (String url) throws ClientApiException { + accessUrlViaProxy(proxy, url); + } + + private int statusToInt(ApiResponse response) { + return Integer.parseInt(((ApiResponseElement)response).getValue()); + } + + public void checkAlerts (List ignoreAlerts, List requireAlerts) throws ClientApiException { + HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + verifyAlerts(results.get("requireAlerts"), results.get("reportAlerts")); + } + + private void verifyAlerts(List requireAlerts, List reportAlerts) throws ClientApiException { + StringBuilder sb = new StringBuilder(); + if (reportAlerts.size() > 0) { + sb.append("Found ").append(reportAlerts.size()).append(" alerts\n"); + for (Alert alert: reportAlerts) { + sb.append('\t'); + sb.append(alert.toString()); + sb.append('\n'); + } + } + if (requireAlerts != null && requireAlerts.size() > 0) { + if (sb.length() > 0) { + sb.append('\n'); + } + sb.append("Not found ").append(requireAlerts.size()).append(" alerts\n"); + for (Alert alert: requireAlerts) { + sb.append('\t'); + sb.append(alert.toString()); + sb.append('\n'); + } + } + if (sb.length() > 0) { + if (debug) { + debugStream.println("Failed: " + sb.toString()); + } + throw new ClientApiException (sb.toString()); + } + } + + public void checkAlerts(List ignoreAlerts, List requireAlerts, File outputFile) throws ClientApiException { + HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + int alertsFound = results.get("reportAlerts").size(); + int alertsNotFound = results.get("requireAlerts").size(); + int alertsIgnored = results.get("ignoredAlerts").size(); + String resultsString = String.format("Alerts Found: %d, Alerts required but not found: %d, Alerts ignored: %d", alertsFound, alertsNotFound, alertsIgnored); + try { + AlertsFile.saveAlertsToFile(results.get("requireAlerts"), results.get("reportAlerts"), results.get("ignoredAlerts"), outputFile); + } catch (Exception e) { + throw new ClientApiException (e); + } + if (alertsFound>0 || alertsNotFound>0){ + throw new ClientApiException("Check Alerts Failed!\n"+resultsString); + }else{ + if (debug) { + debugStream.println("Check Alerts Passed!\n" + resultsString); + } + } + } + + public List getAlerts(String baseUrl, int start, int count) throws ClientApiException { + List alerts = new ArrayList(); + ApiResponse response = core.alerts(baseUrl, String.valueOf(start), String.valueOf(count)); + if (response != null && response instanceof ApiResponseList) { + ApiResponseList alertList = (ApiResponseList)response; + for (ApiResponse resp : alertList.getItems()) { + alerts.add(new Alert((ApiResponseSet) resp)); + } + } + return alerts; + } + + private HashMap> checkForAlerts(List ignoreAlerts, List requireAlerts) throws ClientApiException { + List reportAlerts = new ArrayList<>(); + List ignoredAlerts = new ArrayList<>(); + List alerts = getAlerts(null, -1, -1); + for (Alert alert : alerts) { + boolean ignore = false; + if (ignoreAlerts != null) { + for (Alert ignoreAlert : ignoreAlerts) { + if (alert.matches(ignoreAlert)) { + if (debug) { + debugStream.println("Ignoring alert " + ignoreAlert); + } + ignoredAlerts.add(alert); + ignore = true; + break; + } + } + } + if (! ignore) { + reportAlerts.add(alert); + } + if (requireAlerts != null) { + for (Alert requireAlert : requireAlerts) { + if (alert.matches(requireAlert)) { + if (debug) { + debugStream.println("Found alert " + alert); + } + requireAlerts.remove(requireAlert); + // Remove it from the not-ignored list as well + reportAlerts.remove(alert); + break; + } + } + } + } + HashMap> results = new HashMap<>(); + results.put("reportAlerts", reportAlerts); + results.put("requireAlerts", requireAlerts); + results.put("ignoredAlerts", ignoredAlerts); + return results; + } + + private void accessUrlViaProxy (Proxy proxy, String apiurl) throws ClientApiException { + try { + URL url = new URL(apiurl); + if (debug) { + debugStream.println("Open URL: " + apiurl); + } + HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy); + uc.connect(); + + BufferedReader in; + try { + in = new BufferedReader(new InputStreamReader(uc.getInputStream())); + String inputLine; + + while ((inputLine = in.readLine()) != null) { + if (debug) { + debugStream.println(inputLine); + } + } + in.close(); + + } catch (IOException e) { + // Ignore + if (debug) { + debugStream.println("Ignoring exception " + e); + } + } + } catch (Exception e) { + throw new ClientApiException (e); + } + } + + public ApiResponse callApi (String component, String type, String method, + Map params) throws ClientApiException { + Document dom = this.callApiDom(component, type, method, params); + return ApiResponseFactory.getResponse(dom.getFirstChild()); + } + + private Document callApiDom (String component, String type, String method, + Map params) throws ClientApiException { + try { + HttpRequest request = buildZapRequest("xml", component, type, method, params); + if (debug) { + debugStream.println("Open URL: " + request.getRequestUri()); + } + //get the factory + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + //Using factory get an instance of document builder + DocumentBuilder db = dbf.newDocumentBuilder(); + //parse using builder to get DOM representation of the XML file + return db.parse(getConnectionInputStream(request)); + } catch (Exception e) { + throw new ClientApiException(e); + } + } + + private InputStream getConnectionInputStream(HttpRequest request) throws IOException { + HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); + for (Entry header : request.getHeaders().entrySet()) { + uc.setRequestProperty(header.getKey(), header.getValue()); + } + uc.connect(); + if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { + return uc.getErrorStream(); + } + return uc.getInputStream(); + } + + public byte[] callApiOther (String component, String type, String method, + Map params) throws ClientApiException { + try { + HttpRequest request = buildZapRequest("other", component, type, method, params); + if (debug) { + debugStream.println("Open URL: " + request.getRequestUri()); + } + InputStream in = getConnectionInputStream(request); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buffer = new byte[8 * 1024]; + try { + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } finally { + out.close(); + in.close(); + } + return out.toByteArray(); + + } catch (Exception e) { + throw new ClientApiException(e); + } + } + + private HttpRequest buildZapRequest( + String format, + String component, + String type, + String method, + Map params) throws MalformedURLException { + StringBuilder sb = new StringBuilder(); + sb.append("http://zap/"); + sb.append(format); + sb.append('/'); + sb.append(component); + sb.append('/'); + sb.append(type); + sb.append('/'); + sb.append(method); + sb.append('/'); + if (params != null) { + if (apiKey != null && !apiKey.isEmpty()) { + params.put(ZAP_API_KEY_PARAM, apiKey); + } + + sb.append('?'); + for (Map.Entry p : params.entrySet()) { + sb.append(encodeQueryParam(p.getKey())); + sb.append('='); + if (p.getValue() != null) { + sb.append(encodeQueryParam(p.getValue())); + } + sb.append('&'); + } + } else if (apiKey != null && !apiKey.isEmpty()) { + // Send the API key even if there are no parameters, + // older ZAP versions might need it as (query) parameter. + sb.append('?'); + sb.append(encodeQueryParam(ZAP_API_KEY_PARAM)); + sb.append('='); + sb.append(encodeQueryParam(apiKey)); + } + + HttpRequest request = new HttpRequest(new URL(sb.toString())); + if (apiKey != null && !apiKey.isEmpty()) { + request.addHeader(ZAP_API_KEY_HEADER, apiKey); + } + return request; + } + + private static String encodeQueryParam(String param) { + try { + return URLEncoder.encode(param, "UTF-8"); + } catch (UnsupportedEncodingException ignore) { + // UTF-8 is a standard charset. + } + return param; + } + + /** + * Adds the given regular expression to the exclusion list of the given context. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to add. + * @throws Exception if an error occurred while calling the API. + * @deprecated (1.1.0) Use {@link Context#excludeFromContext(String, String)} instead. + * @see #context + */ + @Deprecated + public void addExcludeFromContext(String apikey, String contextName, String regex) throws Exception { + context.excludeFromContext(apikey, contextName, regex); + } + + /** + * Adds the given regular expression to the inclusion list of the given context. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to add. + * @throws Exception if an error occurred while calling the API. + * @deprecated (1.1.0) Use {@link Context#includeInContext(String, String)} instead. + * @see #context + */ + @Deprecated + public void addIncludeInContext(String apikey, String contextName, String regex) throws Exception { + context.includeInContext(apikey, contextName, regex); + } + + /** + * Includes just one of the nodes that match the given regular expression in the context with the given name. + *

+ * Nodes that do not match the regular expression are excluded. + * + * @param apikey the API key, might be {@code null}. + * @param contextName the name of the context. + * @param regex the regular expression to match the node/URL. + * @throws Exception if an error occurred while calling the API. + * @deprecated (1.1.0) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. + */ + @Deprecated + public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) throws Exception { + List sessionUrls = getSessionUrls(); + boolean foundOneMatch = false; + for (String sessionUrl : sessionUrls){ + if (sessionUrl.matches(regex)){ + if (foundOneMatch){ + addExcludeFromContext(apikey, contextName, sessionUrl); + } else { + foundOneMatch = true; + } + } + } + if(!foundOneMatch){ + throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); + } + + } + + /** + * Includes just one of the nodes that match the given regular expression in the context with the given name. + *

+ * Nodes that do not match the regular expression are excluded. + * + * @param contextName the name of the context. + * @param regex the regular expression to match the node/URL. + * @throws Exception if an error occurred while calling the API. + */ + public void includeOneMatchingNodeInContext(String contextName, String regex) throws Exception { + List sessionUrls = getSessionUrls(); + boolean foundOneMatch = false; + for (String sessionUrl : sessionUrls) { + if (sessionUrl.matches(regex)) { + if (foundOneMatch) { + context.excludeFromContext(contextName, regex); + } else { + foundOneMatch = true; + } + } + } + if (!foundOneMatch) { + throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); + } + } + + private List getSessionUrls() throws Exception { + List sessionUrls = new ArrayList<>(); + ApiResponse response = core.urls(); + if (response != null && response instanceof ApiResponseList) { + ApiResponseElement urlList = (ApiResponseElement) ((ApiResponseList) response).getItems().get(0); + for (ApiResponse element: ((ApiResponseList) response).getItems()){ + URL url = new URL(((ApiResponseElement)element).getValue()); + sessionUrls.add(url.getProtocol()+"://"+url.getHost()+url.getPath()); + } + System.out.println(urlList); + } + return sessionUrls; + } + + /** + * Active scans the given site, that's in scope. + *

+ * The method returns only after the scan has finished. + * + * @param apikey the API key, might be {@code null}. + * @param url the site to scan + * @throws Exception if an error occurred while calling the API. + * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of + * the {@code ClientApi} constructors. + */ + @Deprecated + public void activeScanSiteInScope(String apikey, String url) throws Exception { + ascan.scan(apikey, url, "true", "true", "", "", ""); + waitForAScanToFinish(url); + } + + /** + * Active scans the given site, that's in scope. + *

+ * The method returns only after the scan has finished. + * + * @param url the site to scan + * @throws Exception if an error occurred while calling the API. + * @since 1.1.0 + */ + public void activeScanSiteInScope(String url) throws Exception { + ascan.scan(url, "true", "true", "", "", ""); + waitForAScanToFinish(url); + } + + private void waitForAScanToFinish(String targetUrl) throws ClientApiException { + // Poll until spider finished + int status = 0; + while ( status < 100) { + status = statusToInt(ascan.status("")); + if(debug){ + String format = "Scanning %s Progress: %d%%"; + System.out.println(String.format(format, targetUrl, status)); + }try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // Ignore + } + } + } + + /** + * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. + *

+ * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not + * successful. The connection attempts might be polled in one second interval. + * + * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start + * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting + * @see #waitForSuccessfulConnectionToZap(int, int) + */ + public void waitForSuccessfulConnectionToZap(int timeoutInSeconds) throws ClientApiException { + waitForSuccessfulConnectionToZap(timeoutInSeconds, DEFAULT_CONNECTION_POOLING_IN_MS); + } + + /** + * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. + *

+ * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not + * successful. The connection attempts are done with the given polling interval. + * + * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start + * @param pollingIntervalInMs the interval, in milliseconds, for connection polling + * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting. + * @throws IllegalArgumentException if the interval for connection polling is negative. + * @see #waitForSuccessfulConnectionToZap(int) + */ + public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIntervalInMs) throws ClientApiException { + int timeoutInMs = (int) TimeUnit.SECONDS.toMillis(timeoutInSeconds); + int connectionTimeoutInMs = timeoutInMs; + boolean connectionSuccessful = false; + long startTime = System.currentTimeMillis(); + do { + try (Socket socket = new Socket()) { + try { + socket.connect(new InetSocketAddress(zapAddress, zapPort), connectionTimeoutInMs); + connectionSuccessful = true; + } catch (SocketTimeoutException ignore) { + throw newTimeoutConnectionToZap(timeoutInSeconds); + } catch (IOException ignore) { + // and keep trying but wait some time first... + try { + Thread.sleep(pollingIntervalInMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new ClientApiException( + "The ClientApi was interrupted while sleeping between connection polling.", + e); + } + + long ellapsedTime = System.currentTimeMillis() - startTime; + if (ellapsedTime >= timeoutInMs) { + throw newTimeoutConnectionToZap(timeoutInSeconds); + } + connectionTimeoutInMs = (int) (timeoutInMs - ellapsedTime); + } + } catch (IOException ignore) { + // the closing state doesn't matter. + } + } while (!connectionSuccessful); + } + + private static ClientApiException newTimeoutConnectionToZap(int timeoutInSeconds) { + return new ClientApiException("Unable to connect to ZAP's proxy after " + timeoutInSeconds + " seconds."); + } + + /** + * A simple HTTP request. + *

+ * Contains the request URI and headers. + */ + private static class HttpRequest { + + private final URL requestUri; + private final Map headers; + + public HttpRequest(URL url) { + this.requestUri = url; + this.headers = new HashMap<>(); + } + + /** + * Gets the request URI of the request. + * + * @return the request URI. + */ + public URL getRequestUri() { + return requestUri; + } + + /** + * Adds a header with the given name and value. + *

+ * If a header with the given name already exists it is replaced with the new value. + * + * @param name the name of the header. + * @param value the value of the header. + */ + public void addHeader(String name, String value) { + headers.put(name, value); + } + + /** + * Gets the headers of the HTTP request. An unmodifiable {@code Map} containing the headers (the keys correspond to the + * header names and the values for its contents). + * + * @return an unmodifiable {@code Map} containing the headers. + */ + public Map getHeaders() { + return Collections.unmodifiableMap(headers); + } + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index ca01e9a..505f85a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -1,330 +1,330 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2012 The Zed Attack Proxy Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.core; - -import java.io.File; -import java.net.ConnectException; -import java.util.HashMap; -import java.util.List; - -public class ClientApiMain { - - private HashMap params = new HashMap<>(); - private String zapaddr = "localhost"; - private int zapport = 8090; - private Task task; - private ClientApi api; - private boolean debug = false; - - private enum Task{ - stop, showAlerts, checkAlerts, saveSession, newSession, activeScanUrl, activeScanSiteInScope, - addExcludeRegexToContext, addIncludeRegexToContext, addIncludeOneMatchingNodeToContext - } - - public static void main(String[] args){ - new ClientApiMain(args); - } - - public ClientApiMain(String[] args){ - initialize(args); - try { - executeTask(); - }catch (Exception e){ - e.printStackTrace(); - showHelp(); - } - } - - private void executeTask() throws Exception { - try { - switch(task){ - case stop: - api.core.shutdown(); - break; - case checkAlerts: - if (params.get("alertsFile") == null){ - System.out.println("No Alerts File Path Supplied\n"); - showHelp(); - System.exit(1); - } - File alertsFile = (File)params.get("alertsFile"); - if (!alertsFile.exists()){ - System.out.println("File not Found: "+alertsFile.getAbsolutePath()); - showHelp(); - System.exit(1); - } - if (params.get("outputFile") == null){ - api.checkAlerts( - AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), - AlertsFile.getAlertsFromFile(alertsFile, "requireAlert")); - }else{ - File outFile = (File)params.get("outputFile"); - try { - api.checkAlerts( - AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), - AlertsFile.getAlertsFromFile(alertsFile, "requireAlert"), - outFile); - } catch (AssertionError e){ - System.out.println(e.getMessage()); - System.exit(1); - } - } - break; - case showAlerts: - List alerts = api.getAlerts(null, -1, -1); - for (Alert alert : alerts) { - System.out.println(alert.toString()); - } - break; - case saveSession: - if (params.get("sessionName") == null){ - System.out.println("No session name supplied\n"); - showHelp(); - System.exit(1); - } - api.core.saveSession((String)params.get("sessionName"), "true"); - break; - case newSession: - if (params.get("sessionName") == null){ - api.core.newSession("", "true"); - }else{ - api.core.newSession((String)params.get("sessionName"), "true"); - } - break; - case activeScanUrl: - if (params.get("url") == null){ - System.out.println("No url supplied\n"); - showHelp(); - System.exit(1); - }else{ - api.ascan.scan((String)params.get("url"), "true", "false", "", "", ""); - } - break; - case activeScanSiteInScope: - checkForUrlParam(); - api.activeScanSiteInScope((String)params.get("url")); - break; - case addExcludeRegexToContext: - checkForContextNameParam(); - checkForRegexParam(); - api.context.excludeFromContext((String)params.get("contextName"), (String)params.get("regex")); - break; - case addIncludeRegexToContext: - checkForContextNameParam(); - checkForRegexParam(); - api.context.includeInContext((String)params.get("contextName"), (String)params.get("regex")); - break; - case addIncludeOneMatchingNodeToContext: - checkForContextNameParam(); - checkForRegexParam(); - api.includeOneMatchingNodeInContext((String)params.get("contextName"), (String)params.get("regex")); - break; - } - } catch (ConnectException e){ - System.out.println(e.getMessage()+String.format(": zapaddr=%s, zapport=%d\n", zapaddr, zapport)); - showHelp(); - System.exit(1); - } - } - - private void checkForRegexParam() { - if(params.get("regex") == null){ - System.out.println("No regex supplied\n"); - showHelp(); - System.exit(1); - } - } - - private void checkForContextNameParam() { - if (params.get("contextName") == null){ - System.out.println("No context name supplied\n"); - showHelp(); - System.exit(1); - } - } - - private void checkForUrlParam() { - if (params.get("url") == null){ - System.out.println("No url supplied\n"); - showHelp(); - System.exit(1); - } - } - - private void initialize(String[] args) { - if (args.length > 0){ - if (args[0].equalsIgnoreCase("help")){ - try { - setTask(args[1]); - }catch (IndexOutOfBoundsException e){ - showHelp(); - System.exit(1); - } - showHelp(); - System.exit(0); - } - setTask(args[0]); - for (String arg: args){ - String[] pair = arg.split("="); - if (pair.length == 2){ - if (pair[0].equalsIgnoreCase("zapaddr")){ - zapaddr = pair[1]; - } else if(pair[0].equalsIgnoreCase("zapport")){ - try { - zapport = Integer.parseInt(pair[1]); - } catch (NumberFormatException e){ - System.out.println("Invalid value to zapport, must be in integer: "+pair[1]); - showHelp(); - System.exit(1); - } - }else if(pair[0].equalsIgnoreCase("debug") && pair[1].equalsIgnoreCase("true")){ - debug = true; - }else if(pair[0].contains("File")){ - params.put(pair[0], new File(pair[1])); - } - else{ - params.put(pair[0], pair[1]); - } - } - } - } else { - showHelp(); - System.exit(1); - } - api = new ClientApi(zapaddr, zapport, (String) params.get("apikey"), debug); - } - - private void setTask(String arg) { - try { - task = Task.valueOf(arg); - } catch (IllegalArgumentException e){ - System.out.println("Unknown Task: "+arg); - showHelp(); - System.exit(1); - } - } - - private void showHelp() { - String help = ""; - if (task == null){ - help = "usage: java -jar zap-api.jar [args]\n\n"+ - "Type 'java -jar zap-api.jar help ' for help on a specific subcommand.\n\n" + - "Available subcommands:\n"+ - "\tstop\n"+ - "\tcheckAlerts\n"+ - "\tshowAlerts\n"+ - "\tsaveSession\n"+ - "\tnewSession\n"; - } else{ - // TODO add case for activeScanSiteInScope - switch (task){ - case stop: - help = "usage: stop [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar stop' \n\t\t" + - "Stop zap listening on default settings (localhost:8090)\n\t" + - "2. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 apikey=1234' \n\t\t" + - "Stop zap listening on 192.168.1.1:8090\n\t" + - "3. Type 'java -jar zap-api.jar stop zapport=7080 apikey=1234' \n\t\t" + - "Stop zap listening on localhost:7080\n\t" + - "4. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 zapport=7080 apikey=1234' \n\t\t" + - "Stop zap listening on 192.168.1.1:7080\n\n"; - break; - case checkAlerts: - help = "usage: checkAlerts alertsFile={PATH} [outputFile={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples\n\t" + - "1. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\"' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile, using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on localhost:8090\n\t" + - "3. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on 192.168.1.1:7080\n" + - "Note: for paths containing spaces ensure path is enclosed in quotes\n\n"; - break; - case showAlerts: - help = "usage: showAlerts [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar showAlerts' \n\t\t" + - "Show alerts, using zap listening on default settings (localhost:8090)\n\t" + - "2. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1' \n\t\t" + - "Show alerts, using zap listening on 192.168.1.1:8090\n\t" + - "3. Type 'java -jar zap-api.jar showAlerts zapport=7080' \n\t\t" + - "Show alerts, using zap listening on localhost:7080\n\t" + - "4. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Show alerts, using zap listening on 192.168.1.1:7080\n\n"; - break; - case saveSession: - help = "usage: saveSession sessionName={PATH} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\"' \n\t\t" + - "Save zap session using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Save zap session using zap listening on 192.168.1.1:7080\nNote: for paths containing spaces ensure path is enclosed in quotes\n\n"; - break; - case newSession: - help = "usage: newSession [sessionName={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar newSession' \n\t\t" + - "Start new session using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar newSession zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Start new session using zap listening on 192.168.1.1:7080\n\t" + - "3. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/newsession\"' \n\t\t" + - "Start new session using zap listening on localhost:8090, creating session files at /Users/me/My Documents/mysession/newsession\n\t" + - "4. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Start new session using zap listening on 192.168.1.1:7080, creating session files at /Users/me/My Documents/mysession/newsession\n" + - "Note: for paths containing spaces ensure path is enclosed in quotes"; - break; - case activeScanUrl: - help = "usage: activeScanUrl url={url} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' \n\t\t" + - "Execute and active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Execute and active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; - break; - case addExcludeRegexToContext: - help = "usage: addExcludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addExcludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "Urls that match the regex will be excluded from scope using context '1' using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addExcludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Urls that match the regex will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; - break; - case addIncludeRegexToContext: - help = "usage: addIncludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addIncludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "Urls that match the regex will be included in scope using context '1' using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addIncludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Urls that match the regex will be included in scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; - break; - case addIncludeOneMatchingNodeToContext: - help = "usage: addIncludeOneMatchingNodeToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; - break; - } - } - System.out.println(help); - } -} +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2012 The Zed Attack Proxy Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.core; + +import java.io.File; +import java.net.ConnectException; +import java.util.HashMap; +import java.util.List; + +public class ClientApiMain { + + private HashMap params = new HashMap<>(); + private String zapaddr = "localhost"; + private int zapport = 8090; + private Task task; + private ClientApi api; + private boolean debug = false; + + private enum Task{ + stop, showAlerts, checkAlerts, saveSession, newSession, activeScanUrl, activeScanSiteInScope, + addExcludeRegexToContext, addIncludeRegexToContext, addIncludeOneMatchingNodeToContext + } + + public static void main(String[] args){ + new ClientApiMain(args); + } + + public ClientApiMain(String[] args){ + initialize(args); + try { + executeTask(); + }catch (Exception e){ + e.printStackTrace(); + showHelp(); + } + } + + private void executeTask() throws Exception { + try { + switch(task){ + case stop: + api.core.shutdown(); + break; + case checkAlerts: + if (params.get("alertsFile") == null){ + System.out.println("No Alerts File Path Supplied\n"); + showHelp(); + System.exit(1); + } + File alertsFile = (File)params.get("alertsFile"); + if (!alertsFile.exists()){ + System.out.println("File not Found: "+alertsFile.getAbsolutePath()); + showHelp(); + System.exit(1); + } + if (params.get("outputFile") == null){ + api.checkAlerts( + AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), + AlertsFile.getAlertsFromFile(alertsFile, "requireAlert")); + }else{ + File outFile = (File)params.get("outputFile"); + try { + api.checkAlerts( + AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), + AlertsFile.getAlertsFromFile(alertsFile, "requireAlert"), + outFile); + } catch (AssertionError e){ + System.out.println(e.getMessage()); + System.exit(1); + } + } + break; + case showAlerts: + List alerts = api.getAlerts(null, -1, -1); + for (Alert alert : alerts) { + System.out.println(alert.toString()); + } + break; + case saveSession: + if (params.get("sessionName") == null){ + System.out.println("No session name supplied\n"); + showHelp(); + System.exit(1); + } + api.core.saveSession((String)params.get("sessionName"), "true"); + break; + case newSession: + if (params.get("sessionName") == null){ + api.core.newSession("", "true"); + }else{ + api.core.newSession((String)params.get("sessionName"), "true"); + } + break; + case activeScanUrl: + if (params.get("url") == null){ + System.out.println("No url supplied\n"); + showHelp(); + System.exit(1); + }else{ + api.ascan.scan((String)params.get("url"), "true", "false", "", "", ""); + } + break; + case activeScanSiteInScope: + checkForUrlParam(); + api.activeScanSiteInScope((String)params.get("url")); + break; + case addExcludeRegexToContext: + checkForContextNameParam(); + checkForRegexParam(); + api.context.excludeFromContext((String)params.get("contextName"), (String)params.get("regex")); + break; + case addIncludeRegexToContext: + checkForContextNameParam(); + checkForRegexParam(); + api.context.includeInContext((String)params.get("contextName"), (String)params.get("regex")); + break; + case addIncludeOneMatchingNodeToContext: + checkForContextNameParam(); + checkForRegexParam(); + api.includeOneMatchingNodeInContext((String)params.get("contextName"), (String)params.get("regex")); + break; + } + } catch (ConnectException e){ + System.out.println(e.getMessage()+String.format(": zapaddr=%s, zapport=%d\n", zapaddr, zapport)); + showHelp(); + System.exit(1); + } + } + + private void checkForRegexParam() { + if(params.get("regex") == null){ + System.out.println("No regex supplied\n"); + showHelp(); + System.exit(1); + } + } + + private void checkForContextNameParam() { + if (params.get("contextName") == null){ + System.out.println("No context name supplied\n"); + showHelp(); + System.exit(1); + } + } + + private void checkForUrlParam() { + if (params.get("url") == null){ + System.out.println("No url supplied\n"); + showHelp(); + System.exit(1); + } + } + + private void initialize(String[] args) { + if (args.length > 0){ + if (args[0].equalsIgnoreCase("help")){ + try { + setTask(args[1]); + }catch (IndexOutOfBoundsException e){ + showHelp(); + System.exit(1); + } + showHelp(); + System.exit(0); + } + setTask(args[0]); + for (String arg: args){ + String[] pair = arg.split("="); + if (pair.length == 2){ + if (pair[0].equalsIgnoreCase("zapaddr")){ + zapaddr = pair[1]; + } else if(pair[0].equalsIgnoreCase("zapport")){ + try { + zapport = Integer.parseInt(pair[1]); + } catch (NumberFormatException e){ + System.out.println("Invalid value to zapport, must be in integer: "+pair[1]); + showHelp(); + System.exit(1); + } + }else if(pair[0].equalsIgnoreCase("debug") && pair[1].equalsIgnoreCase("true")){ + debug = true; + }else if(pair[0].contains("File")){ + params.put(pair[0], new File(pair[1])); + } + else{ + params.put(pair[0], pair[1]); + } + } + } + } else { + showHelp(); + System.exit(1); + } + api = new ClientApi(zapaddr, zapport, (String) params.get("apikey"), debug); + } + + private void setTask(String arg) { + try { + task = Task.valueOf(arg); + } catch (IllegalArgumentException e){ + System.out.println("Unknown Task: "+arg); + showHelp(); + System.exit(1); + } + } + + private void showHelp() { + String help = ""; + if (task == null){ + help = "usage: java -jar zap-api.jar [args]\n\n"+ + "Type 'java -jar zap-api.jar help ' for help on a specific subcommand.\n\n" + + "Available subcommands:\n"+ + "\tstop\n"+ + "\tcheckAlerts\n"+ + "\tshowAlerts\n"+ + "\tsaveSession\n"+ + "\tnewSession\n"; + } else{ + // TODO add case for activeScanSiteInScope + switch (task){ + case stop: + help = "usage: stop [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar stop' \n\t\t" + + "Stop zap listening on default settings (localhost:8090)\n\t" + + "2. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 apikey=1234' \n\t\t" + + "Stop zap listening on 192.168.1.1:8090\n\t" + + "3. Type 'java -jar zap-api.jar stop zapport=7080 apikey=1234' \n\t\t" + + "Stop zap listening on localhost:7080\n\t" + + "4. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 zapport=7080 apikey=1234' \n\t\t" + + "Stop zap listening on 192.168.1.1:7080\n\n"; + break; + case checkAlerts: + help = "usage: checkAlerts alertsFile={PATH} [outputFile={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples\n\t" + + "1. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\"' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile, using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on localhost:8090\n\t" + + "3. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on 192.168.1.1:7080\n" + + "Note: for paths containing spaces ensure path is enclosed in quotes\n\n"; + break; + case showAlerts: + help = "usage: showAlerts [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar showAlerts' \n\t\t" + + "Show alerts, using zap listening on default settings (localhost:8090)\n\t" + + "2. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1' \n\t\t" + + "Show alerts, using zap listening on 192.168.1.1:8090\n\t" + + "3. Type 'java -jar zap-api.jar showAlerts zapport=7080' \n\t\t" + + "Show alerts, using zap listening on localhost:7080\n\t" + + "4. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Show alerts, using zap listening on 192.168.1.1:7080\n\n"; + break; + case saveSession: + help = "usage: saveSession sessionName={PATH} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\"' \n\t\t" + + "Save zap session using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Save zap session using zap listening on 192.168.1.1:7080\nNote: for paths containing spaces ensure path is enclosed in quotes\n\n"; + break; + case newSession: + help = "usage: newSession [sessionName={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar newSession' \n\t\t" + + "Start new session using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar newSession zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Start new session using zap listening on 192.168.1.1:7080\n\t" + + "3. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/newsession\"' \n\t\t" + + "Start new session using zap listening on localhost:8090, creating session files at /Users/me/My Documents/mysession/newsession\n\t" + + "4. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Start new session using zap listening on 192.168.1.1:7080, creating session files at /Users/me/My Documents/mysession/newsession\n" + + "Note: for paths containing spaces ensure path is enclosed in quotes"; + break; + case activeScanUrl: + help = "usage: activeScanUrl url={url} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' \n\t\t" + + "Execute and active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Execute and active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; + break; + case addExcludeRegexToContext: + help = "usage: addExcludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addExcludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "Urls that match the regex will be excluded from scope using context '1' using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addExcludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Urls that match the regex will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + break; + case addIncludeRegexToContext: + help = "usage: addIncludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addIncludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "Urls that match the regex will be included in scope using context '1' using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addIncludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Urls that match the regex will be included in scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + break; + case addIncludeOneMatchingNodeToContext: + help = "usage: addIncludeOneMatchingNodeToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + break; + } + } + System.out.println(help); + } +} From 9ae817b0c8f621be71e2d2a663fd1c5197c16b55 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 9 Mar 2018 22:27:41 +0000 Subject: [PATCH 047/148] Add Java 9 to Travis CI builds Change .travis.yml to also run the build with Java 9. Change japicmp task to not run by default in Java 9 (requires a module). --- .travis.yml | 4 ++++ subprojects/zap-clientapi/zap-clientapi.gradle | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9699ac8..5eae43d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,10 @@ language: java sudo: false +jdk: + - oraclejdk8 + - oraclejdk9 + before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 38d822c..627a720 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -34,7 +34,9 @@ dependencyCheck { task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { group 'verification' description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." - check.dependsOn 'japicmp' + if (!JavaVersion.current().isJava9Compatible()) { + check.dependsOn 'japicmp' + } inputs.file(jar) oldClasspath = configurations.japicmpBaseline From 58c4be5fc7fbd889f4fb36b7950e21b7ebfb29d4 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 9 Mar 2018 23:11:58 +0000 Subject: [PATCH 048/148] Update Gradle and plugins Update Gradle to 4.6. Update OWASP Dependency-Check plugin to 3.1.1. Update JApicmp Gradle Plugin to 0.2.6. Remove the plugins for the IDEs, the project is expected to be imported from the IDEs instead. --- build.gradle | 4 +--- gradle/eclipse.gradle | 4 ---- gradle/idea.gradle | 4 ---- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 54333 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../zap-clientapi/zap-clientapi.gradle | 4 ++-- 6 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 gradle/eclipse.gradle delete mode 100644 gradle/idea.gradle diff --git a/build.gradle b/build.gradle index b73b972..b57599d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,8 @@ task wrapper(type: Wrapper) { - gradleVersion = '4.2.1' + gradleVersion = '4.6' } apply from: "gradle/compile.gradle" -apply from: "gradle/idea.gradle" -apply from: "gradle/eclipse.gradle" subprojects { apply plugin: 'java' diff --git a/gradle/eclipse.gradle b/gradle/eclipse.gradle deleted file mode 100644 index bbe861d..0000000 --- a/gradle/eclipse.gradle +++ /dev/null @@ -1,4 +0,0 @@ -allprojects { - apply plugin: 'eclipse' - -} \ No newline at end of file diff --git a/gradle/idea.gradle b/gradle/idea.gradle deleted file mode 100644 index 18c6ba7..0000000 --- a/gradle/idea.gradle +++ /dev/null @@ -1,4 +0,0 @@ -allprojects { - apply plugin: "idea" - -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 736fb7d3f94c051b359fc7ae7212d351bc094bdd..c44b679acd3f794ddbb3aa5e919244914911014a 100644 GIT binary patch delta 16251 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 DxE3ri delta 16603 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 74bb778..ea720f9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 38d822c..052fecd 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,6 +1,6 @@ plugins { - id "me.champeau.gradle.japicmp" version "0.2.5" - id "org.owasp.dependencycheck" version "3.0.2" + id "me.champeau.gradle.japicmp" version "0.2.6" + id "org.owasp.dependencycheck" version "3.1.1" } apply plugin: 'maven' From 510741a06d24487c2403ee8c0026b3f36ac1bbc1 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 9 Mar 2018 21:50:19 +0000 Subject: [PATCH 049/148] Normalise license header Normalise the license header in all Java classes. Add Spotless Gradle plugin and the license header for Java source files, to ensure all Java source files have the expected license header. --- build.gradle | 12 ++++++++ gradle/spotless/license.java | 19 +++++++++++++ .../clientapi/ant/AbstractActiveScanTask.java | 6 ++-- .../zaproxy/clientapi/ant/AccessUrlTask.java | 4 +-- .../clientapi/ant/ActiveScanSubtreeTask.java | 4 +-- .../clientapi/ant/ActiveScanUrlTask.java | 4 +-- .../zaproxy/clientapi/ant/AlertCheckTask.java | 4 +-- .../org/zaproxy/clientapi/ant/AlertTask.java | 4 +-- .../clientapi/ant/LoadSessionTask.java | 4 +-- .../zaproxy/clientapi/ant/NewSessionTask.java | 4 +-- .../org/zaproxy/clientapi/ant/ReportTask.java | 6 ++-- .../clientapi/ant/SaveSessionTask.java | 4 +-- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 4 +-- .../zaproxy/clientapi/ant/StopZapTask.java | 4 +-- .../org/zaproxy/clientapi/ant/ZapTask.java | 4 +-- .../org/zaproxy/clientapi/ant/BuildTest.java | 6 ++-- .../clientapi/examples/SimpleExample.java | 4 +-- .../org/zaproxy/clientapi/examples/Test.java | 19 +++++++++++++ .../FormBasedAuthentication.java | 7 +++-- .../org/zaproxy/clientapi/core/Alert.java | 4 +-- .../zaproxy/clientapi/core/AlertsFile.java | 19 +++++++++++++ .../zaproxy/clientapi/core/ApiResponse.java | 28 ++++++++++--------- .../clientapi/core/ApiResponseElement.java | 28 ++++++++++--------- .../clientapi/core/ApiResponseFactory.java | 19 +++++++++++++ .../clientapi/core/ApiResponseList.java | 28 ++++++++++--------- .../clientapi/core/ApiResponseSet.java | 28 ++++++++++--------- .../org/zaproxy/clientapi/core/ClientApi.java | 4 +-- .../clientapi/core/ClientApiException.java | 4 +-- .../zaproxy/clientapi/core/ClientApiMain.java | 4 +-- .../java/org/zaproxy/clientapi/gen/Acsrf.java | 9 +++--- .../org/zaproxy/clientapi/gen/AjaxSpider.java | 9 +++--- .../zaproxy/clientapi/gen/AlertFilter.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Ascan.java | 9 +++--- .../zaproxy/clientapi/gen/Authentication.java | 9 +++--- .../zaproxy/clientapi/gen/Authorization.java | 9 +++--- .../org/zaproxy/clientapi/gen/Autoupdate.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Break.java | 9 +++--- .../org/zaproxy/clientapi/gen/Context.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Core.java | 9 +++--- .../org/zaproxy/clientapi/gen/ForcedUser.java | 9 +++--- .../zaproxy/clientapi/gen/HttpSessions.java | 9 +++--- .../zaproxy/clientapi/gen/ImportLogFiles.java | 9 +++--- .../org/zaproxy/clientapi/gen/Importurls.java | 9 +++--- .../org/zaproxy/clientapi/gen/Openapi.java | 9 +++--- .../org/zaproxy/clientapi/gen/Params.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Pnh.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Pscan.java | 9 +++--- .../org/zaproxy/clientapi/gen/Replacer.java | 9 +++--- .../org/zaproxy/clientapi/gen/Reveal.java | 9 +++--- .../org/zaproxy/clientapi/gen/Script.java | 9 +++--- .../org/zaproxy/clientapi/gen/Search.java | 9 +++--- .../org/zaproxy/clientapi/gen/Selenium.java | 9 +++--- .../clientapi/gen/SessionManagement.java | 9 +++--- .../org/zaproxy/clientapi/gen/Spider.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Stats.java | 9 +++--- .../java/org/zaproxy/clientapi/gen/Users.java | 9 +++--- .../gen/deprecated/AcsrfDeprecated.java | 6 ++-- .../gen/deprecated/AjaxSpiderDeprecated.java | 6 ++-- .../gen/deprecated/AscanDeprecated.java | 6 ++-- .../deprecated/AuthenticationDeprecated.java | 6 ++-- .../deprecated/AuthorizationDeprecated.java | 6 ++-- .../gen/deprecated/AutoupdateDeprecated.java | 6 ++-- .../gen/deprecated/BreakDeprecated.java | 6 ++-- .../gen/deprecated/ContextDeprecated.java | 6 ++-- .../gen/deprecated/CoreDeprecated.java | 6 ++-- .../gen/deprecated/ForcedUserDeprecated.java | 6 ++-- .../deprecated/HttpSessionsDeprecated.java | 6 ++-- .../deprecated/ImportLogFilesDeprecated.java | 6 ++-- .../gen/deprecated/PnhDeprecated.java | 6 ++-- .../gen/deprecated/PscanDeprecated.java | 6 ++-- .../gen/deprecated/RevealDeprecated.java | 6 ++-- .../gen/deprecated/ScriptDeprecated.java | 6 ++-- .../gen/deprecated/SearchDeprecated.java | 6 ++-- .../gen/deprecated/SeleniumDeprecated.java | 6 ++-- .../SessionManagementDeprecated.java | 6 ++-- .../gen/deprecated/SpiderDeprecated.java | 6 ++-- .../gen/deprecated/StatsDeprecated.java | 6 ++-- .../gen/deprecated/UsersDeprecated.java | 6 ++-- 78 files changed, 367 insertions(+), 297 deletions(-) create mode 100644 gradle/spotless/license.java diff --git a/build.gradle b/build.gradle index b57599d..e2b317b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,7 @@ +plugins { + id "com.diffplug.gradle.spotless" version "3.10.0" apply false +} + task wrapper(type: Wrapper) { gradleVersion = '4.6' } @@ -6,6 +10,8 @@ apply from: "gradle/compile.gradle" subprojects { apply plugin: 'java' + apply plugin: 'com.diffplug.gradle.spotless' + group = 'org.zaproxy' version '1.6.0-SNAPSHOT' @@ -18,4 +24,10 @@ subprojects { sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 + + spotless { + java { + licenseHeaderFile "$rootDir/gradle/spotless/license.java" + } + } } diff --git a/gradle/spotless/license.java b/gradle/spotless/license.java new file mode 100644 index 0000000..6c2dca3 --- /dev/null +++ b/gradle/spotless/license.java @@ -0,0 +1,19 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright $YEAR The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ \ No newline at end of file diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java index 010d4f1..c7526c8 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java index 5a927fa..9603d7f 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java index 461e242..f5f63d3 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index 286a595..0bec8ea 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java index aa94b9f..fa6294c 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index c45767a..c282864 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java index afdeb53..62ec645 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java index be9e83c..6731a01 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java index 38d8622..6ce2d56 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java index 84a88f6..d403abc 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 634ef01..81f9a06 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 6ae309b..924824b 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java index 7ddcd41..07b170c 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java index 7a03a5f..982f358 100644 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 7df206e..ae51052 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 The Zed Attack Proxy Team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java index 7ea0bab..317a1c3 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java @@ -1,3 +1,22 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2011 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.zaproxy.clientapi.examples; import java.util.ArrayList; diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java index bc91ba6..60c6158 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright the ZAP development team + * Copyright 2014 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index 74523f5..d59590c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index 026e66b..9da1811 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -1,3 +1,22 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.zaproxy.clientapi.core; import org.jdom.Document; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java index 71add5d..41a9580 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java @@ -1,19 +1,21 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.zaproxy.clientapi.core; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java index cac1213..84ef674 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java @@ -1,19 +1,21 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.zaproxy.clientapi.core; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java index 20df241..051c965 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java @@ -1,3 +1,22 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.zaproxy.clientapi.core; import org.w3c.dom.NamedNodeMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java index 6bbbf38..ad587c0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java @@ -1,19 +1,21 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.zaproxy.clientapi.core; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java index d6d1c9b..a5c338e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java @@ -1,19 +1,21 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * + * Copyright 2012 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.zaproxy.clientapi.core; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index f878483..720cd6e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2011 The Zed Attack Proxy Team + * Copyright 2011 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java index acf0ce8..ea129ca 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2012 The Zed Attack Proxy Team + * Copyright 2012 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index 505f85a..71a5e90 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -3,13 +3,13 @@ * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2012 The Zed Attack Proxy Team + * Copyright 2012 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index c79fc50..342ead8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 3f82a63..0aeaab0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 8f593de..2aa50bb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index af1c22a..cccbe35 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java index 97cb977..158d8c4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java index 398acfa..243eca8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index fee9298..59c69b8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index a0e03b7..7f8c25b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 5250734..6644d0c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index e66d0f3..6b4009e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java index cbd9bc3..8d5c198 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index 6bb0989..f5c4d38 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java index b8a8f5c..81b022b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java index 3a3c977..773582d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index d04a6aa..5b5ce61 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java index c19b47f..ada2df7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java index cc40af1..e60d4a4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index 42d7c15..36d53ed 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index b4d71db..4c6f271 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java index 6838f04..80f545b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index bd90ebd..81ac487 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.nio.charset.Charset; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index ed20b18..702821a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 7f15fe5..c0bb6e3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2016 the ZAP development team + * Copyright 2016 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java index f89fa40..1e3bbdb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index dba56fa..7b1f5ac 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java index 287efc3..50aae4c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 698045e..6489f52 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -1,14 +1,15 @@ -/* Zed Attack Proxy (ZAP) and its related class files. +/* + * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * - * Copyright 2017 the ZAP development team + * Copyright 2017 The ZAP Development Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -16,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - - package org.zaproxy.clientapi.gen; import java.util.HashMap; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java index 7ca9813..66a711a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java index 002568f..ed149bd 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java index e25a94a..06c4287 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java index 03bc878..a264e5d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java index 22fdabf..c0880df 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java index 23d4b36..606fca4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java index 9d17fb7..b2da9bd 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java index 100a436..b9ea12a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java index 7216465..f08b629 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java index 90d6021..f3d7932 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java index d5e5259..fe4e4e5 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java index 8685bac..521dad9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java index 8777b69..1e96713 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java index 43ef865..90fdded 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java index 3afc333..de25806 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java index 7353b45..bb99747 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java index 9abb72e..b411ac2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java index cdb78c6..a597fdb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java index 78ebd5c..9ff6b60 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java index 35737d3..d012878 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java index 155338e..f04e0b9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java index 33bb8b4..1614da3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java @@ -1,10 +1,10 @@ /* * Zed Attack Proxy (ZAP) and its related class files. - * + * * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * + * * Copyright 2017 The ZAP Development Team - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at From ac0f9ea2d2687e6c2b81d041361ea501e6898641 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 12 Mar 2018 11:21:32 +0000 Subject: [PATCH 050/148] Normalise format/indentation of source code Set up the Spotless plugin to check/enforce the format/indentation of the whole source code, currently set to use Google Java Style (AOSP). --- build.gradle | 2 + .../clientapi/ant/AbstractActiveScanTask.java | 56 +- .../zaproxy/clientapi/ant/AccessUrlTask.java | 36 +- .../clientapi/ant/ActiveScanSubtreeTask.java | 9 +- .../clientapi/ant/ActiveScanUrlTask.java | 8 +- .../zaproxy/clientapi/ant/AlertCheckTask.java | 87 +- .../org/zaproxy/clientapi/ant/AlertTask.java | 208 +-- .../clientapi/ant/LoadSessionTask.java | 34 +- .../zaproxy/clientapi/ant/NewSessionTask.java | 34 +- .../org/zaproxy/clientapi/ant/ReportTask.java | 200 +-- .../clientapi/ant/SaveSessionTask.java | 34 +- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 52 +- .../zaproxy/clientapi/ant/StopZapTask.java | 17 +- .../org/zaproxy/clientapi/ant/ZapTask.java | 79 +- .../org/zaproxy/clientapi/ant/BuildTest.java | 33 +- .../clientapi/examples/SimpleExample.java | 22 +- .../org/zaproxy/clientapi/examples/Test.java | 85 +- .../FormBasedAuthentication.java | 319 ++-- .../org/zaproxy/clientapi/core/Alert.java | 839 +++++----- .../zaproxy/clientapi/core/AlertsFile.java | 79 +- .../zaproxy/clientapi/core/ApiResponse.java | 26 +- .../clientapi/core/ApiResponseElement.java | 79 +- .../clientapi/core/ApiResponseFactory.java | 56 +- .../clientapi/core/ApiResponseList.java | 154 +- .../clientapi/core/ApiResponseSet.java | 313 ++-- .../org/zaproxy/clientapi/core/ClientApi.java | 566 +++---- .../clientapi/core/ClientApiException.java | 74 +- .../zaproxy/clientapi/core/ClientApiMain.java | 287 ++-- .../java/org/zaproxy/clientapi/gen/Acsrf.java | 68 +- .../org/zaproxy/clientapi/gen/AjaxSpider.java | 461 +++--- .../zaproxy/clientapi/gen/AlertFilter.java | 132 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 1276 +++++++-------- .../zaproxy/clientapi/gen/Authentication.java | 109 +- .../zaproxy/clientapi/gen/Authorization.java | 82 +- .../org/zaproxy/clientapi/gen/Autoupdate.java | 343 ++-- .../java/org/zaproxy/clientapi/gen/Break.java | 215 ++- .../org/zaproxy/clientapi/gen/Context.java | 322 ++-- .../java/org/zaproxy/clientapi/gen/Core.java | 1386 ++++++++--------- .../org/zaproxy/clientapi/gen/ForcedUser.java | 70 +- .../zaproxy/clientapi/gen/HttpSessions.java | 243 ++- .../zaproxy/clientapi/gen/ImportLogFiles.java | 95 +- .../org/zaproxy/clientapi/gen/Importurls.java | 28 +- .../org/zaproxy/clientapi/gen/Openapi.java | 66 +- .../org/zaproxy/clientapi/gen/Params.java | 34 +- .../java/org/zaproxy/clientapi/gen/Pnh.java | 114 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 171 +- .../org/zaproxy/clientapi/gen/Replacer.java | 122 +- .../org/zaproxy/clientapi/gen/Reveal.java | 58 +- .../org/zaproxy/clientapi/gen/Script.java | 135 +- .../org/zaproxy/clientapi/gen/Search.java | 390 ++--- .../org/zaproxy/clientapi/gen/Selenium.java | 218 ++- .../clientapi/gen/SessionManagement.java | 68 +- .../org/zaproxy/clientapi/gen/Spider.java | 1000 ++++++------ .../java/org/zaproxy/clientapi/gen/Stats.java | 226 ++- .../java/org/zaproxy/clientapi/gen/Users.java | 148 +- .../gen/deprecated/AcsrfDeprecated.java | 21 +- .../gen/deprecated/AjaxSpiderDeprecated.java | 98 +- .../gen/deprecated/AscanDeprecated.java | 286 ++-- .../deprecated/AuthenticationDeprecated.java | 33 +- .../deprecated/AuthorizationDeprecated.java | 14 +- .../gen/deprecated/AutoupdateDeprecated.java | 75 +- .../gen/deprecated/BreakDeprecated.java | 30 +- .../gen/deprecated/ContextDeprecated.java | 87 +- .../gen/deprecated/CoreDeprecated.java | 253 +-- .../gen/deprecated/ForcedUserDeprecated.java | 22 +- .../deprecated/HttpSessionsDeprecated.java | 67 +- .../deprecated/ImportLogFilesDeprecated.java | 55 +- .../gen/deprecated/PnhDeprecated.java | 62 +- .../gen/deprecated/PscanDeprecated.java | 39 +- .../gen/deprecated/RevealDeprecated.java | 13 +- .../gen/deprecated/ScriptDeprecated.java | 47 +- .../gen/deprecated/SearchDeprecated.java | 38 +- .../gen/deprecated/SeleniumDeprecated.java | 76 +- .../SessionManagementDeprecated.java | 14 +- .../gen/deprecated/SpiderDeprecated.java | 197 ++- .../gen/deprecated/StatsDeprecated.java | 37 +- .../gen/deprecated/UsersDeprecated.java | 49 +- 77 files changed, 6581 insertions(+), 6400 deletions(-) diff --git a/build.gradle b/build.gradle index e2b317b..3f6a4a0 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,8 @@ subprojects { spotless { java { licenseHeaderFile "$rootDir/gradle/spotless/license.java" + + googleJavaFormat().style('AOSP') } } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java index c7526c8..ee8d00a 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java @@ -25,32 +25,32 @@ public abstract class AbstractActiveScanTask extends ZapTask { - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public void execute() throws BuildException { - try { - waitForActiveScan(extractValue(startScan())); - } catch (Exception e) { - throw new BuildException(e); - } - } - - protected abstract ApiResponse startScan() throws ClientApiException; - - private void waitForActiveScan(String scanId) throws ClientApiException, InterruptedException { - int progress; - do { - progress = Integer.parseInt(extractValue(getClientApi().ascan.status(scanId))); - Thread.sleep(1000); - } while (progress < 100); - } + private String url; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Override + public void execute() throws BuildException { + try { + waitForActiveScan(extractValue(startScan())); + } catch (Exception e) { + throw new BuildException(e); + } + } + + protected abstract ApiResponse startScan() throws ClientApiException; + + private void waitForActiveScan(String scanId) throws ClientApiException, InterruptedException { + int progress; + do { + progress = Integer.parseInt(extractValue(getClientApi().ascan.status(scanId))); + Thread.sleep(1000); + } while (progress < 100); + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java index 9603d7f..3ff8d9b 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java @@ -22,24 +22,24 @@ import org.apache.tools.ant.BuildException; public class AccessUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().accessUrl(url); - - } catch (Exception e) { - throw new BuildException(e); - } - } - public String getUrl() { - return url; - } + private String url; - public void setUrl(String url) { - this.url = url; - } + @Override + public void execute() throws BuildException { + try { + this.getClientApi().accessUrl(url); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java index f5f63d3..62e1b30 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java @@ -24,9 +24,8 @@ public class ActiveScanSubtreeTask extends AbstractActiveScanTask { - @Override - protected ApiResponse startScan() throws ClientApiException { - return this.getClientApi().ascan.scan(getUrl(), "true", "false", "", "", ""); - } - + @Override + protected ApiResponse startScan() throws ClientApiException { + return this.getClientApi().ascan.scan(getUrl(), "true", "false", "", "", ""); + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java index 0bec8ea..c5fba37 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java @@ -24,8 +24,8 @@ public class ActiveScanUrlTask extends AbstractActiveScanTask { - @Override - protected ApiResponse startScan() throws ClientApiException { - return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); - } + @Override + protected ApiResponse startScan() throws ClientApiException { + return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java index fa6294c..627015a 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java @@ -21,47 +21,60 @@ import java.util.ArrayList; import java.util.List; - import org.apache.tools.ant.BuildException; import org.zaproxy.clientapi.core.Alert; public class AlertCheckTask extends ZapTask { - - private List ignoreAlertTasks = new ArrayList<>(); - private List requireAlertTasks = new ArrayList<>(); - - @Override - public void execute() throws BuildException { - try { - List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); - List requireAlerts = new ArrayList<>(requireAlertTasks.size()); - for (AlertTask alert: ignoreAlertTasks) { - ignoreAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); - } - for (AlertTask alert: requireAlertTasks) { - requireAlerts.add(new Alert(alert.getName(), alert.getUrl(), alert.getRisk(), alert.getConfidence(), alert.getParam(), alert.getOther())); - } - - this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); - - } catch (Exception e) { - throw new BuildException(e); - } - } - public void addIgnoreAlert(AlertTask alert) { - this.ignoreAlertTasks.add(alert); - } - - public void addRequireAlert(AlertTask alert) { - this.requireAlertTasks.add(alert); - } - - public List getIgnoreAlerts() { - return ignoreAlertTasks; - } + private List ignoreAlertTasks = new ArrayList<>(); + private List requireAlertTasks = new ArrayList<>(); + + @Override + public void execute() throws BuildException { + try { + List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); + List requireAlerts = new ArrayList<>(requireAlertTasks.size()); + for (AlertTask alert : ignoreAlertTasks) { + ignoreAlerts.add( + new Alert( + alert.getName(), + alert.getUrl(), + alert.getRisk(), + alert.getConfidence(), + alert.getParam(), + alert.getOther())); + } + for (AlertTask alert : requireAlertTasks) { + requireAlerts.add( + new Alert( + alert.getName(), + alert.getUrl(), + alert.getRisk(), + alert.getConfidence(), + alert.getParam(), + alert.getOther())); + } + + this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public void addIgnoreAlert(AlertTask alert) { + this.ignoreAlertTasks.add(alert); + } + + public void addRequireAlert(AlertTask alert) { + this.requireAlertTasks.add(alert); + } + + public List getIgnoreAlerts() { + return ignoreAlertTasks; + } - public List getRequireAlerts() { - return requireAlertTasks; - } + public List getRequireAlerts() { + return requireAlertTasks; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index c282864..92fa232 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -22,105 +22,111 @@ import org.apache.tools.ant.Task; public class AlertTask extends Task { - private String name; - private String risk; - /** - * @deprecated - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - private String reliability; - private String confidence; - private String url; - private String other; - private String param; - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @since 1.1.0 - */ - public String getName() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @since 1.1.0 - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @deprecated (1.1.0) Use {@link #getName()} instead. - */ - @Deprecated - public String getAlert() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @deprecated (1.1.0) Use {@link #setName(String)} instead. - */ - @Deprecated - public void setAlert(String name) { - this.name = name; - } - public String getRisk() { - return risk; - } - public void setRisk(String risk) { - this.risk = risk; - } - /** - * @deprecated (2.4.0) {@link #getConfidence()}. - * Use of reliability has been deprecated in favour of using confidence. - */ - @Deprecated - public String getReliability() { - return reliability; - } - /** - * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(String reliability) { - this.reliability = reliability; - } - public String getConfidence() { - return confidence; - } - public void setConfidence(String confidence) { - this.confidence = confidence; - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } - public String getOther() { - return other; - } - public void setOther(String other) { - this.other = other; - } - public String getParam() { - return param; - } - public void setParam(String param) { - this.param = param; - } - + private String name; + private String risk; + /** @deprecated Use of reliability has been deprecated in favour of using confidence */ + @Deprecated private String reliability; + + private String confidence; + private String url; + private String other; + private String param; + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since 1.1.0 + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since 1.1.0 + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (1.1.0) Use {@link #getName()} instead. + */ + @Deprecated + public String getAlert() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (1.1.0) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; + } + + public String getRisk() { + return risk; + } + + public void setRisk(String risk) { + this.risk = risk; + } + /** + * @deprecated (2.4.0) {@link #getConfidence()}. Use of reliability has been deprecated in + * favour of using confidence. + */ + @Deprecated + public String getReliability() { + return reliability; + } + /** + * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} Use of reliability has been + * deprecated in favour of using confidence + */ + @Deprecated + public void setReliability(String reliability) { + this.reliability = reliability; + } + + public String getConfidence() { + return confidence; + } + + public void setConfidence(String confidence) { + this.confidence = confidence; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } + + public String getParam() { + return param; + } + + public void setParam(String param) { + this.param = param; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java index 62ec645..acf6119 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java @@ -22,24 +22,24 @@ import org.apache.tools.ant.BuildException; public class LoadSessionTask extends ZapTask { - - private String name; - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.loadSession(name); - - } catch (Exception e) { - throw new BuildException(e); - } - } + private String name; - public String getName() { - return name; - } + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.loadSession(name); - public void setName(String name) { - this.name = name; - } + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java index 6731a01..0172fbc 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java @@ -22,24 +22,24 @@ import org.apache.tools.ant.BuildException; public class NewSessionTask extends ZapTask { - - private String name; - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.newSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } + private String name; - public String getName() { - return name; - } + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.newSession(name, "true"); - public void setName(String name) { - this.name = name; - } + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java index 6ce2d56..8fcd198 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java @@ -26,104 +26,112 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; - import org.apache.tools.ant.BuildException; public class ReportTask extends ZapTask { - private static final String HTML_REPORT_TYPE = "html"; - private static final String MD_REPORT_TYPE = "md"; - private static final String XML_REPORT_TYPE = "xml"; - private static final String DEFAULT_REPORT_TYPE = HTML_REPORT_TYPE; - - private static final List SUPPORTED_REPORT_TYPES = Arrays.asList(HTML_REPORT_TYPE, MD_REPORT_TYPE, XML_REPORT_TYPE); - - private String type = DEFAULT_REPORT_TYPE; - private File file; - private boolean overwrite; - - public void setType(String type) { - this.type = type; - } - - public void setFile(String file) { - this.file = new File(file); - if (!this.file.isAbsolute()) { - this.file = new File(getProject().getBaseDir(), file); - } - } - - public void setOverwrite(boolean overwrite) { - this.overwrite = overwrite; - } - - @Override - public void execute() throws BuildException { - validateTaskAttributes(); - - byte[] reportContents; - try { - switch (type.toLowerCase()) { - case MD_REPORT_TYPE: - reportContents = this.getClientApi().core.mdreport(); - break; - case XML_REPORT_TYPE: - reportContents = this.getClientApi().core.xmlreport(); - break; - case HTML_REPORT_TYPE: - default: - reportContents = this.getClientApi().core.htmlreport(); - break; - } - } catch (Exception e) { - throw new BuildException("Failed to obtain the report from ZAP: " + e.getMessage(), e); - } - - try (OutputStream os = Files.newOutputStream(file.toPath())) { - os.write(reportContents); - } catch (IOException e) { - throw new BuildException("Failed to save the report: " + e.getMessage(), e); - } - - } - - private void validateTaskAttributes() { - if (type == null || type.isEmpty()) { - type = DEFAULT_REPORT_TYPE; - } else { - type = type.toLowerCase(Locale.ROOT); - if (!SUPPORTED_REPORT_TYPES.contains(type)) { - throw new BuildException("Unknown report type [" + type + "], supported types: " + SUPPORTED_REPORT_TYPES); - } - } - - if (file == null) { - throw new BuildException("The 'file' attribute must be provided."); - } - - if (file.isFile()) { - if (!file.canWrite()) { - throw new BuildException("The provided file is not writable: " + file.getAbsolutePath()); - } - - if (!overwrite) { - throw new BuildException( - "The file already exists but 'overwrite' attribute is not set to 'true': " + file.getAbsolutePath()); - } - } else if (!file.exists()) { - File dir = file.getParentFile(); - if (dir == null) { - throw new BuildException( - "Unable to determine parent directory of the file provided: " + file.getAbsolutePath()); - } - - dir.mkdirs(); - if (!dir.canWrite()) { - throw new BuildException("The provided directory does not exist or is not writable: " + dir.getAbsolutePath()); - } - } else { - throw new BuildException("The 'file' attribute does not specify a file: " + file.getAbsolutePath()); - } - } - + private static final String HTML_REPORT_TYPE = "html"; + private static final String MD_REPORT_TYPE = "md"; + private static final String XML_REPORT_TYPE = "xml"; + private static final String DEFAULT_REPORT_TYPE = HTML_REPORT_TYPE; + + private static final List SUPPORTED_REPORT_TYPES = + Arrays.asList(HTML_REPORT_TYPE, MD_REPORT_TYPE, XML_REPORT_TYPE); + + private String type = DEFAULT_REPORT_TYPE; + private File file; + private boolean overwrite; + + public void setType(String type) { + this.type = type; + } + + public void setFile(String file) { + this.file = new File(file); + if (!this.file.isAbsolute()) { + this.file = new File(getProject().getBaseDir(), file); + } + } + + public void setOverwrite(boolean overwrite) { + this.overwrite = overwrite; + } + + @Override + public void execute() throws BuildException { + validateTaskAttributes(); + + byte[] reportContents; + try { + switch (type.toLowerCase()) { + case MD_REPORT_TYPE: + reportContents = this.getClientApi().core.mdreport(); + break; + case XML_REPORT_TYPE: + reportContents = this.getClientApi().core.xmlreport(); + break; + case HTML_REPORT_TYPE: + default: + reportContents = this.getClientApi().core.htmlreport(); + break; + } + } catch (Exception e) { + throw new BuildException("Failed to obtain the report from ZAP: " + e.getMessage(), e); + } + + try (OutputStream os = Files.newOutputStream(file.toPath())) { + os.write(reportContents); + } catch (IOException e) { + throw new BuildException("Failed to save the report: " + e.getMessage(), e); + } + } + + private void validateTaskAttributes() { + if (type == null || type.isEmpty()) { + type = DEFAULT_REPORT_TYPE; + } else { + type = type.toLowerCase(Locale.ROOT); + if (!SUPPORTED_REPORT_TYPES.contains(type)) { + throw new BuildException( + "Unknown report type [" + + type + + "], supported types: " + + SUPPORTED_REPORT_TYPES); + } + } + + if (file == null) { + throw new BuildException("The 'file' attribute must be provided."); + } + + if (file.isFile()) { + if (!file.canWrite()) { + throw new BuildException( + "The provided file is not writable: " + file.getAbsolutePath()); + } + + if (!overwrite) { + throw new BuildException( + "The file already exists but 'overwrite' attribute is not set to 'true': " + + file.getAbsolutePath()); + } + } else if (!file.exists()) { + File dir = file.getParentFile(); + if (dir == null) { + throw new BuildException( + "Unable to determine parent directory of the file provided: " + + file.getAbsolutePath()); + } + + dir.mkdirs(); + if (!dir.canWrite()) { + throw new BuildException( + "The provided directory does not exist or is not writable: " + + dir.getAbsolutePath()); + } + } else { + throw new BuildException( + "The 'file' attribute does not specify a file: " + file.getAbsolutePath()); + } + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java index d403abc..4e56e0f 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java @@ -22,24 +22,24 @@ import org.apache.tools.ant.BuildException; public class SaveSessionTask extends ZapTask { - - private String name; - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.saveSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } + private String name; - public String getName() { - return name; - } + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.saveSession(name, "true"); - public void setName(String name) { - this.name = name; - } + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java index 81f9a06..31c260f 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java @@ -22,31 +22,31 @@ import org.apache.tools.ant.BuildException; public class SpiderUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); - - int progress; - do { - progress = Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); - Thread.sleep(1000); - } while (progress < 100); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } + private String url; + + @Override + public void execute() throws BuildException { + try { + String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); + + int progress; + do { + progress = + Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); + Thread.sleep(1000); + } while (progress < 100); + + } catch (Exception e) { + throw new BuildException(e); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java index 924824b..fa69f85 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java @@ -22,14 +22,13 @@ import org.apache.tools.ant.BuildException; public class StopZapTask extends ZapTask { - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.shutdown(); - } catch (Exception e) { - throw new BuildException(e); - } - } + @Override + public void execute() throws BuildException { + try { + this.getClientApi().core.shutdown(); + } catch (Exception e) { + throw new BuildException(e); + } + } } diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java index 07b170c..4dc8da0 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java @@ -25,48 +25,51 @@ import org.zaproxy.clientapi.core.ClientApi; public abstract class ZapTask extends Task { - private String zapAddress; - private int zapPort; - private boolean debug = false; - private String apikey; - - protected ClientApi getClientApi() { - return new ClientApi(zapAddress, zapPort, apikey, debug); - } + private String zapAddress; + private int zapPort; + private boolean debug = false; + private String apikey; - public String getZapAddress() { - return zapAddress; - } - public void setZapAddress(String zapAddress) { - this.zapAddress = zapAddress; - } - public int getZapPort() { - return zapPort; - } - public void setZapPort(int zapPort) { - this.zapPort = zapPort; - } + protected ClientApi getClientApi() { + return new ClientApi(zapAddress, zapPort, apikey, debug); + } - public boolean isDebug() { - return debug; - } + public String getZapAddress() { + return zapAddress; + } - public void setDebug(boolean debug) { - this.debug = debug; - } + public void setZapAddress(String zapAddress) { + this.zapAddress = zapAddress; + } - public String getApikey() { - return apikey; - } + public int getZapPort() { + return zapPort; + } - public void setApikey(String apikey) { - this.apikey = apikey; - } + public void setZapPort(int zapPort) { + this.zapPort = zapPort; + } - protected String extractValue(ApiResponse element) { - if (element instanceof ApiResponseElement) { - return ((ApiResponseElement) element).getValue(); - } - return null; - } + public boolean isDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + + public String getApikey() { + return apikey; + } + + public void setApikey(String apikey) { + this.apikey = apikey; + } + + protected String extractValue(ApiResponse element) { + if (element instanceof ApiResponseElement) { + return ((ApiResponseElement) element).getValue(); + } + return null; + } } diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java index 982f358..182e200 100644 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -21,13 +21,13 @@ import static org.junit.Assert.assertTrue; +import fi.iki.elonen.NanoHTTPD; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.util.HashMap; import java.util.Map; - import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildFileRule; import org.apache.tools.ant.filters.StringInputStream; @@ -39,11 +39,7 @@ import org.junit.rules.TemporaryFolder; import org.zaproxy.clientapi.core.ClientApiException; -import fi.iki.elonen.NanoHTTPD; - -/** - * Tests that the tasks accept the expected attributes and nested elements. - */ +/** Tests that the tasks accept the expected attributes and nested elements. */ public class BuildTest { private static final String BUILD_FILE_NAME = "build.xml"; @@ -52,17 +48,16 @@ public class BuildTest { private static SimpleServer zap; private static SimpleServer targetSite; - @Rule - public final TemporaryFolder buildDir = new TemporaryFolder(); + @Rule public final TemporaryFolder buildDir = new TemporaryFolder(); - @Rule - public final BuildFileRule buildRule = new BuildFileRule(); + @Rule public final BuildFileRule buildRule = new BuildFileRule(); @BeforeClass public static void setUp() throws IOException { - zap = new SimpleServer( - "text/xml; charset=UTF-8", - "OK"); + zap = + new SimpleServer( + "text/xml; charset=UTF-8", + "OK"); targetSite = new SimpleServer("text/plain", ""); } @@ -88,7 +83,9 @@ public void setUpBuildFile() { buildRule.getProject().setProperty("zap.addr", "localhost"); buildRule.getProject().setProperty("zap.port", Integer.toString(zap.getListeningPort())); buildRule.getProject().setProperty("zap.key", "API_KEY"); - buildRule.getProject().setProperty("zap.targetUrl", "http://localhost:" + targetSite.getListeningPort()); + buildRule + .getProject() + .setProperty("zap.targetUrl", "http://localhost:" + targetSite.getListeningPort()); buildRule.getProject().setProperty("zap.session", "session"); buildRule.getProject().setProperty("zap.report.path", REPORT_PATH); buildRule.getProject().setProperty("zap.report.type", "html"); @@ -197,9 +194,13 @@ public Response serve(IHTTPSession session) { if (response == null) { response = defaultResponse; } - return new Response(Response.Status.OK, mimeType, new StringInputStream(response), response.length()) { + return new Response( + Response.Status.OK, + mimeType, + new StringInputStream(response), + response.length()) { // Extend to access the constructor. }; } } -} \ No newline at end of file +} diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index ae51052..9ec12c1 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -24,15 +24,17 @@ import org.zaproxy.clientapi.core.ClientApi; /** - * A simple example showing how to use the API to spider and active scan a site and then retrieve and print out the alerts. - *

- * ZAP must be running on the specified host and port for this script to work + * A simple example showing how to use the API to spider and active scan a site and then retrieve + * and print out the alerts. + * + *

ZAP must be running on the specified host and port for this script to work */ public class SimpleExample { private static final String ZAP_ADDRESS = "localhost"; private static final int ZAP_PORT = 8090; - private static final String ZAP_API_KEY = null; // Change this if you have set the apikey in ZAP via Options / API + private static final String ZAP_API_KEY = + null; // Change this if you have set the apikey in ZAP via Options / API private static final String TARGET = "http://localhost:8080/bodgeit/"; @@ -42,7 +44,8 @@ public static void main(String[] args) { try { // Start spidering the target System.out.println("Spider : " + TARGET); - // It's not necessary to pass the ZAP API key again, already set when creating the ClientApi. + // It's not necessary to pass the ZAP API key again, already set when creating the + // ClientApi. ApiResponse resp = api.spider.scan(TARGET, null, null, null, null); String scanid; int progress; @@ -53,7 +56,9 @@ public static void main(String[] args) { // Poll the status until it completes while (true) { Thread.sleep(1000); - progress = Integer.parseInt(((ApiResponseElement) api.spider.status(scanid)).getValue()); + progress = + Integer.parseInt( + ((ApiResponseElement) api.spider.status(scanid)).getValue()); System.out.println("Spider progress : " + progress + "%"); if (progress >= 100) { break; @@ -73,7 +78,9 @@ public static void main(String[] args) { // Poll the status until it completes while (true) { Thread.sleep(5000); - progress = Integer.parseInt(((ApiResponseElement) api.ascan.status(scanid)).getValue()); + progress = + Integer.parseInt( + ((ApiResponseElement) api.ascan.status(scanid)).getValue()); System.out.println("Active Scan progress : " + progress + "%"); if (progress >= 100) { break; @@ -89,5 +96,4 @@ public static void main(String[] args) { e.printStackTrace(); } } - } diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java index 317a1c3..9cd89c1 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java @@ -21,54 +21,57 @@ import java.util.ArrayList; import java.util.List; - import org.zaproxy.clientapi.core.Alert; -import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.Alert.Confidence; import org.zaproxy.clientapi.core.Alert.Risk; +import org.zaproxy.clientapi.core.ClientApi; public class Test { - /** - * @param args - */ - public static void main(String[] args) { - // TODO List - // High priority - // * Start ZAP in background - task still waits! } Need docs? - // * Get checkAlerts to work with inner elements } - // Medium - tidy up - // * Create min zapapi.jar - // * Correct way of installing in Eclipse - // Docs etc - // * Full wave reg test - // * Full wavsep reg test - // * Documentation - // Publicise - // * Blog, tweet etc etc - // * Work out priorities for extending api - // * Complete tasks - more for internal use than anything else + /** @param args */ + public static void main(String[] args) { + // TODO List + // High priority + // * Start ZAP in background - task still waits! } Need docs? + // * Get checkAlerts to work with inner elements } + // Medium - tidy up + // * Create min zapapi.jar + // * Correct way of installing in Eclipse + // Docs etc + // * Full wave reg test + // * Full wavsep reg test + // * Documentation + // Publicise + // * Blog, tweet etc etc + // * Work out priorities for extending api + // * Complete tasks - more for internal use than anything else - List ignoreAlerts = new ArrayList<>(2); - ignoreAlerts.add(new Alert("Cookie set without HttpOnly flag", null, Risk.Low, Confidence.Medium, null, null)); - ignoreAlerts.add(new Alert(null, null, Risk.Low, Confidence.Medium, null, null)); - - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, null ); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + List ignoreAlerts = new ArrayList<>(2); + ignoreAlerts.add( + new Alert( + "Cookie set without HttpOnly flag", + null, + Risk.Low, + Confidence.Medium, + null, + null)); + ignoreAlerts.add(new Alert(null, null, Risk.Low, Confidence.Medium, null, null)); - List requireAlerts = new ArrayList<>(1); - //ignoreAlerts.add(new Alert(null, null, null, null, null, null)); - requireAlerts.add(new Alert("Not present", null, Risk.Low, Confidence.Medium, null, null)); - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, requireAlerts); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } -} + try { + (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, null); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + List requireAlerts = new ArrayList<>(1); + // ignoreAlerts.add(new Alert(null, null, null, null, null, null)); + requireAlerts.add(new Alert("Not present", null, Risk.Low, Confidence.Medium, null, null)); + try { + (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, requireAlerts); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java index 60c6158..44af1ae 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java @@ -23,7 +23,6 @@ import java.net.URLEncoder; import java.util.LinkedList; import java.util.List; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ApiResponseElement; import org.zaproxy.clientapi.core.ApiResponseList; @@ -34,155 +33,181 @@ /** * An example of how to set up authentication via the API and get information about existing * configuration. - * - * Some important aspects regarding the Authentication API: + * + *

Some important aspects regarding the Authentication API: + * *

    - *
  • - * since the AuthenticationMethods are loaded dynamically, there's no way to generate a 'static' API - * for each auth method. That's why, when setting up the authentication method, depending on the - * method, different values are passed to the setAuthenticationMethod . This is where the - * getSupportedAuthenticationMethods and getAuthenticationMethodConfigParams methods come into play. - * Basically the first one gives a list of available/loaded authentication methods while the second - * one gives info about the parameters required to configure each authentication method type.
  • - *
  • when setting up the authentication method for a context, the setAuthenticationMethod method - * is used. It takes the context id on which we're working, the name of the authentication method - * and a 'authMethodConfigParams' parameter which contains all the configuration for the method. The - * format of the value passed for 'authMethodConfigParams' matches the www-form-urlencoded style: - * parameterName = urlEncodedValue. Check out the referenced example to see how the configuration is - * build for the BodgeIt store login. The pseudocode for generating the config would be:
    - * paramA + "=" + urlEncode(paramAValue) + "&" + paramB + "=" + urlEncode(paramBValue) + ... - *
  • - *
  • - * for formBasedAuthentication, the places filled in with the credentials are marked via {%username%} - * and {%password%}, in either the requestUrl or the requestBody
  • + *
  • since the AuthenticationMethods are loaded dynamically, there's no way to generate a + * 'static' API for each auth method. That's why, when setting up the authentication method, + * depending on the method, different values are passed to the setAuthenticationMethod . This + * is where the getSupportedAuthenticationMethods and getAuthenticationMethodConfigParams + * methods come into play. Basically the first one gives a list of available/loaded + * authentication methods while the second one gives info about the parameters required to + * configure each authentication method type. + *
  • when setting up the authentication method for a context, the setAuthenticationMethod method + * is used. It takes the context id on which we're working, the name of the authentication + * method and a 'authMethodConfigParams' parameter which contains all the configuration for + * the method. The format of the value passed for 'authMethodConfigParams' matches the + * www-form-urlencoded style: parameterName = urlEncodedValue. Check out the referenced + * example to see how the configuration is build for the BodgeIt store login. The pseudocode + * for generating the config would be:
    + * + * paramA + "=" + urlEncode(paramAValue) + "&" + paramB + "=" + urlEncode(paramBValue) + ... + * + *
  • for formBasedAuthentication, the places filled in with the credentials are marked via + * {%username%} and {%password%}, in either the requestUrl or the requestBody *
*/ public class FormBasedAuthentication { - private static final String ZAP_ADDRESS = "localhost"; - private static final int ZAP_PORT = 8090; - private static final String ZAP_API_KEY = null; - - private static void listAuthInformation(ClientApi clientApi) throws ClientApiException { - // Check out which authentication methods are supported by the API - List supportedMethodNames = new LinkedList<>(); - ApiResponseList authMethodsList = (ApiResponseList) clientApi.authentication.getSupportedAuthenticationMethods(); - for (ApiResponse authMethod : authMethodsList.getItems()) { - supportedMethodNames.add(((ApiResponseElement) authMethod).getValue()); - } - System.out.println("Supported authentication methods: " + supportedMethodNames); - - // Check out which are the config parameters of the authentication methods - for (String methodName : supportedMethodNames) { - - ApiResponseList configParamsList = (ApiResponseList) clientApi.authentication - .getAuthenticationMethodConfigParams(methodName); - - for (ApiResponse r : configParamsList.getItems()) { - ApiResponseSet set = (ApiResponseSet) r; - System.out.println("'" + methodName + "' config param: " + set.getValue("name") + " (" - + (set.getValue("mandatory").equals("true") ? "mandatory" : "optional") + ")"); - } - } - } - - private static void listUserConfigInformation(ClientApi clientApi) throws ClientApiException { - // Check out which are the config parameters required to set up an user with the currently - // set authentication methods - String contextId = "1"; - ApiResponseList configParamsList = (ApiResponseList) clientApi.users - .getAuthenticationCredentialsConfigParams(contextId); - - StringBuilder sb = new StringBuilder("Users' config params: "); - for (ApiResponse r : configParamsList.getItems()) { - ApiResponseSet set = (ApiResponseSet) r; - sb.append(set.getValue("name")).append(" ("); - sb.append((set.getValue("mandatory").equals("true") ? "mandatory" : "optional")); - sb.append("), "); - } - System.out.println(sb.deleteCharAt(sb.length() - 2).toString()); - } - - private static void setLoggedInIndicator(ClientApi clientApi) throws ClientApiException { - // Prepare values to set, with the logged in indicator as a regex matching the logout link - String loggedInIndicator = ""; - String contextId = "1"; - - // Actually set the logged in indicator - clientApi.authentication.setLoggedInIndicator(contextId, java.util.regex.Pattern.quote(loggedInIndicator)); - - // Check out the logged in indicator that is set - System.out.println("Configured logged in indicator regex: " - + ((ApiResponseElement) clientApi.authentication.getLoggedInIndicator(contextId)).getValue()); - } - - private static void setFormBasedAuthenticationForBodgeit(ClientApi clientApi) throws ClientApiException, - UnsupportedEncodingException { - // Setup the authentication method - String contextId = "1"; - String loginUrl = "http://localhost:8080/bodgeit/login.jsp"; - String loginRequestData = "username={%username%}&password={%password%}"; - - // Prepare the configuration in a format similar to how URL parameters are formed. This - // means that any value we add for the configuration values has to be URL encoded. - StringBuilder formBasedConfig = new StringBuilder(); - formBasedConfig.append("loginUrl=").append(URLEncoder.encode(loginUrl, "UTF-8")); - formBasedConfig.append("&loginRequestData=").append(URLEncoder.encode(loginRequestData, "UTF-8")); - - System.out.println("Setting form based authentication configuration as: " - + formBasedConfig.toString()); - clientApi.authentication.setAuthenticationMethod(contextId, "formBasedAuthentication", - formBasedConfig.toString()); - - // Check if everything is set up ok - System.out - .println("Authentication config: " + clientApi.authentication.getAuthenticationMethod(contextId).toString(0)); - } - - private static void setUserAuthConfigForBodgeit(ClientApi clientApi) throws ClientApiException, UnsupportedEncodingException { - // Prepare info - String contextId = "1"; - String user = "Test User"; - String username = "test@example.com"; - String password = "weakPassword"; - - // Make sure we have at least one user - String userId = extractUserId(clientApi.users.newUser(contextId, user)); - - // Prepare the configuration in a format similar to how URL parameters are formed. This - // means that any value we add for the configuration values has to be URL encoded. - StringBuilder userAuthConfig = new StringBuilder(); - userAuthConfig.append("username=").append(URLEncoder.encode(username, "UTF-8")); - userAuthConfig.append("&password=").append(URLEncoder.encode(password, "UTF-8")); - - System.out.println("Setting user authentication configuration as: " + userAuthConfig.toString()); - clientApi.users.setAuthenticationCredentials(contextId, userId, userAuthConfig.toString()); - - // Check if everything is set up ok - System.out.println("Authentication config: " + clientApi.users.getUserById(contextId, userId).toString(0)); - } - - private static String extractUserId(ApiResponse response) { - return ((ApiResponseElement) response).getValue(); - } - - /** - * The main method. - * - * @param args the arguments - * @throws Exception if an error occurred while accessing the API - */ - public static void main(String[] args) throws Exception { - ClientApi clientApi = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); - - listAuthInformation(clientApi); - System.out.println("-------------"); - setFormBasedAuthenticationForBodgeit(clientApi); - System.out.println("-------------"); - setLoggedInIndicator(clientApi); - System.out.println("-------------"); - listUserConfigInformation(clientApi); - System.out.println("-------------"); - setUserAuthConfigForBodgeit(clientApi); - } + private static final String ZAP_ADDRESS = "localhost"; + private static final int ZAP_PORT = 8090; + private static final String ZAP_API_KEY = null; + + private static void listAuthInformation(ClientApi clientApi) throws ClientApiException { + // Check out which authentication methods are supported by the API + List supportedMethodNames = new LinkedList<>(); + ApiResponseList authMethodsList = + (ApiResponseList) clientApi.authentication.getSupportedAuthenticationMethods(); + for (ApiResponse authMethod : authMethodsList.getItems()) { + supportedMethodNames.add(((ApiResponseElement) authMethod).getValue()); + } + System.out.println("Supported authentication methods: " + supportedMethodNames); + + // Check out which are the config parameters of the authentication methods + for (String methodName : supportedMethodNames) { + + ApiResponseList configParamsList = + (ApiResponseList) + clientApi.authentication.getAuthenticationMethodConfigParams( + methodName); + + for (ApiResponse r : configParamsList.getItems()) { + ApiResponseSet set = (ApiResponseSet) r; + System.out.println( + "'" + + methodName + + "' config param: " + + set.getValue("name") + + " (" + + (set.getValue("mandatory").equals("true") + ? "mandatory" + : "optional") + + ")"); + } + } + } + + private static void listUserConfigInformation(ClientApi clientApi) throws ClientApiException { + // Check out which are the config parameters required to set up an user with the currently + // set authentication methods + String contextId = "1"; + ApiResponseList configParamsList = + (ApiResponseList) + clientApi.users.getAuthenticationCredentialsConfigParams(contextId); + + StringBuilder sb = new StringBuilder("Users' config params: "); + for (ApiResponse r : configParamsList.getItems()) { + ApiResponseSet set = (ApiResponseSet) r; + sb.append(set.getValue("name")).append(" ("); + sb.append((set.getValue("mandatory").equals("true") ? "mandatory" : "optional")); + sb.append("), "); + } + System.out.println(sb.deleteCharAt(sb.length() - 2).toString()); + } + + private static void setLoggedInIndicator(ClientApi clientApi) throws ClientApiException { + // Prepare values to set, with the logged in indicator as a regex matching the logout link + String loggedInIndicator = ""; + String contextId = "1"; + + // Actually set the logged in indicator + clientApi.authentication.setLoggedInIndicator( + contextId, java.util.regex.Pattern.quote(loggedInIndicator)); + + // Check out the logged in indicator that is set + System.out.println( + "Configured logged in indicator regex: " + + ((ApiResponseElement) + clientApi.authentication.getLoggedInIndicator(contextId)) + .getValue()); + } + + private static void setFormBasedAuthenticationForBodgeit(ClientApi clientApi) + throws ClientApiException, UnsupportedEncodingException { + // Setup the authentication method + String contextId = "1"; + String loginUrl = "http://localhost:8080/bodgeit/login.jsp"; + String loginRequestData = "username={%username%}&password={%password%}"; + + // Prepare the configuration in a format similar to how URL parameters are formed. This + // means that any value we add for the configuration values has to be URL encoded. + StringBuilder formBasedConfig = new StringBuilder(); + formBasedConfig.append("loginUrl=").append(URLEncoder.encode(loginUrl, "UTF-8")); + formBasedConfig + .append("&loginRequestData=") + .append(URLEncoder.encode(loginRequestData, "UTF-8")); + + System.out.println( + "Setting form based authentication configuration as: " + + formBasedConfig.toString()); + clientApi.authentication.setAuthenticationMethod( + contextId, "formBasedAuthentication", formBasedConfig.toString()); + + // Check if everything is set up ok + System.out.println( + "Authentication config: " + + clientApi.authentication.getAuthenticationMethod(contextId).toString(0)); + } + + private static void setUserAuthConfigForBodgeit(ClientApi clientApi) + throws ClientApiException, UnsupportedEncodingException { + // Prepare info + String contextId = "1"; + String user = "Test User"; + String username = "test@example.com"; + String password = "weakPassword"; + + // Make sure we have at least one user + String userId = extractUserId(clientApi.users.newUser(contextId, user)); + + // Prepare the configuration in a format similar to how URL parameters are formed. This + // means that any value we add for the configuration values has to be URL encoded. + StringBuilder userAuthConfig = new StringBuilder(); + userAuthConfig.append("username=").append(URLEncoder.encode(username, "UTF-8")); + userAuthConfig.append("&password=").append(URLEncoder.encode(password, "UTF-8")); + + System.out.println( + "Setting user authentication configuration as: " + userAuthConfig.toString()); + clientApi.users.setAuthenticationCredentials(contextId, userId, userAuthConfig.toString()); + + // Check if everything is set up ok + System.out.println( + "Authentication config: " + + clientApi.users.getUserById(contextId, userId).toString(0)); + } + + private static String extractUserId(ApiResponse response) { + return ((ApiResponseElement) response).getValue(); + } + + /** + * The main method. + * + * @param args the arguments + * @throws Exception if an error occurred while accessing the API + */ + public static void main(String[] args) throws Exception { + ClientApi clientApi = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); + + listAuthInformation(clientApi); + System.out.println("-------------"); + setFormBasedAuthenticationForBodgeit(clientApi); + System.out.println("-------------"); + setLoggedInIndicator(clientApi); + System.out.println("-------------"); + listUserConfigInformation(clientApi); + System.out.println("-------------"); + setUserAuthConfigForBodgeit(clientApi); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index d59590c..228a3c6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -19,31 +19,45 @@ */ package org.zaproxy.clientapi.core; - public class Alert { - public enum Risk {Informational, Low, Medium, High}; - /** - * @deprecated (2.4.0) Replaced by {@link Confidence}. - * Use of reliability has been deprecated in favour of using confidence. - */ - @Deprecated - public enum Reliability {Suspicious, Warning}; - public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; - - private String id; - private String name; - private Risk risk; - /** - * @deprecated (2.4.0) Replaced by {@link Confidence}. - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - private Reliability reliability; - private Confidence confidence; - private String url; - private String other; - private String param; + public enum Risk { + Informational, + Low, + Medium, + High + }; + /** + * @deprecated (2.4.0) Replaced by {@link Confidence}. Use of reliability has been deprecated in + * favour of using confidence. + */ + @Deprecated + public enum Reliability { + Suspicious, + Warning + }; + + public enum Confidence { + FalsePositive, + Low, + Medium, + High, + Confirmed + }; + + private String id; + private String name; + private Risk risk; + /** + * @deprecated (2.4.0) Replaced by {@link Confidence}. Use of reliability has been deprecated in + * favour of using confidence + */ + @Deprecated private Reliability reliability; + + private Confidence confidence; + private String url; + private String other; + private String param; private String attack; private String evidence; private String description; @@ -53,7 +67,7 @@ public enum Confidence {FalsePositive, Low, Medium, High, Confirmed}; private int wascId; private String messageId; private String pluginId; - + /** * Constructs an {@code Alert} from the given {@code ApiResponseSet}. * @@ -85,8 +99,13 @@ public Alert(ApiResponseSet apiResponseSet) { this.messageId = apiResponseSet.getStringValue("messageId"); } - public Alert(String name, String url, String riskStr, String confidenceStr, - String param, String other) { + public Alert( + String name, + String url, + String riskStr, + String confidenceStr, + String param, + String other) { super(); this.name = name; this.url = url; @@ -95,17 +114,28 @@ public Alert(String name, String url, String riskStr, String confidenceStr, this.risk = stringToRisk(riskStr); this.confidence = stringToConfidence(confidenceStr); } - - public Alert(String name, String url, Risk risk, Confidence confidence, - String param, String other, String attack, String description, String reference, String solution, - String evidence, int cweId, int wascId) { - super(); - this.name = name; - this.risk = risk; - this.confidence = confidence; - this.url = url; - this.other = other; - this.param = param; + + public Alert( + String name, + String url, + Risk risk, + Confidence confidence, + String param, + String other, + String attack, + String description, + String reference, + String solution, + String evidence, + int cweId, + int wascId) { + super(); + this.name = name; + this.risk = risk; + this.confidence = confidence; + this.url = url; + this.other = other; + this.param = param; this.attack = attack; this.description = description; this.reference = reference; @@ -113,10 +143,10 @@ public Alert(String name, String url, Risk risk, Confidence confidence, this.evidence = evidence; this.cweId = cweId; this.wascId = wascId; - } + } - public Alert(String name, String url, Risk risk, Confidence confidence, - String param, String other) { + public Alert( + String name, String url, Risk risk, Confidence confidence, String param, String other) { super(); this.name = name; this.risk = risk; @@ -125,205 +155,218 @@ public Alert(String name, String url, Risk risk, Confidence confidence, this.other = other; this.param = param; } - - public Alert(String name, String url, Risk risk, Confidence confidence) { - super(); - this.name = name; - this.risk = risk; - this.confidence = confidence; - this.url = url; - } - - public Alert(String name, String url) { - super(); - this.name = name; - this.url = url; - } - - /** - * Converts the given {@code string} to an {@code int}. - *

- * If the given {@code string} is {@code null} or not a valid {@code int}, the default value is returned. - * - * @param string the string to be converted to {@code int}. - * @param defaultValue the value to return in case the {@code string} is {@code null} or not an {@code int}. - * @return the {@code int} converted from the {@code string}, or the default value if {@code string} is {@code null} or not - * an {@code int}. - */ - private static int stringToInt(String string, int defaultValue) { - if (string == null) { - return defaultValue; - } - try { - return Integer.parseInt(string); - } catch (NumberFormatException e) { - // Ignore. - } - return defaultValue; - } - - /** - * Converts the given {@code string} to a {@link Risk} value. - * - * @param string the string to be converted to a {@link Risk} value. - * @return the {@code Risk} value converted from the {@code string}, or null if {@code string} is {@code null}. - */ - private static Risk stringToRisk(String string) { - if (string == null) { - return null; - } - return Risk.valueOf(string); - } - - /** - * Converts the given {@code string} to a {@link Confidence} value. - * - * @param string the string to be converted to a {@link Confidence} value. - * @return the {@code Confidence} value converted from the {@code string}, or null if {@code string} is {@code null}. - */ - private static Confidence stringToConfidence(String string) { - if (string == null) { - return null; - } - if ("False Positive".equalsIgnoreCase(string)) { - return Confidence.FalsePositive; - } - return Confidence.valueOf(string); - } - - /** - * Gets the ID of the alert. - * - * @return the ID of the alert. - * @since 1.1.0 - */ - public String getId() { - return id; - } - - /** - * Gets the ID of the plugin/scanner that raised the alert. - * - * @return the ID of the plugin/scanner that raised the alert. - * @since 1.1.0 - */ - public String getPluginId() { - return pluginId; - } - - /** - * Gets the ID of the HTTP message of the alert. - * - * @return the ID of the HTTP message. - * @since 1.1.0 - */ - public String getMessageId() { - return messageId; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @since 1.1.0 - */ - public String getName() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @since 1.1.0 - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @deprecated (1.1.0) Use {@link #getName()} instead. - */ - @Deprecated - public String getAlert() { - return name; - } - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @deprecated (1.1.0) Use {@link #setName(String)} instead. - */ - @Deprecated - public void setAlert(String name) { - this.name = name; - } - public Risk getRisk() { - return risk; - } - public void setRisk(Risk risk) { - this.risk = risk; - } - public void setRisk(String risk) { - this.risk = Risk.valueOf(risk); - } - /** - * @deprecated - * {@link #getConfidence()} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public Reliability getReliability() { - return reliability; - } - /** - * @deprecated - * {@link #setConfidence(Confidence)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(Reliability reliability) { - this.reliability = reliability; - } - /** - * @deprecated - * {@link #setConfidence(String)} - * Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(String reliability) { - this.reliability = Reliability.valueOf(reliability); - } - public Confidence getConfidence() { - return confidence; - } - public void setConfidence(Confidence confidence) { - this.confidence = confidence; - } - public void setConfidence(String confidence) { - this.confidence = Confidence.valueOf(confidence); - } - public String getUrl() { - return url; - } - public void setUrl(String url) { - this.url = url; - } - public String getOther() { - return other; - } - public void setOther(String other) { - this.other = other; - } - public String getParam() { - return param; - } - public void setParam(String param) { - this.param = param; - } + + public Alert(String name, String url, Risk risk, Confidence confidence) { + super(); + this.name = name; + this.risk = risk; + this.confidence = confidence; + this.url = url; + } + + public Alert(String name, String url) { + super(); + this.name = name; + this.url = url; + } + + /** + * Converts the given {@code string} to an {@code int}. + * + *

If the given {@code string} is {@code null} or not a valid {@code int}, the default value + * is returned. + * + * @param string the string to be converted to {@code int}. + * @param defaultValue the value to return in case the {@code string} is {@code null} or not an + * {@code int}. + * @return the {@code int} converted from the {@code string}, or the default value if {@code + * string} is {@code null} or not an {@code int}. + */ + private static int stringToInt(String string, int defaultValue) { + if (string == null) { + return defaultValue; + } + try { + return Integer.parseInt(string); + } catch (NumberFormatException e) { + // Ignore. + } + return defaultValue; + } + + /** + * Converts the given {@code string} to a {@link Risk} value. + * + * @param string the string to be converted to a {@link Risk} value. + * @return the {@code Risk} value converted from the {@code string}, or null if {@code string} + * is {@code null}. + */ + private static Risk stringToRisk(String string) { + if (string == null) { + return null; + } + return Risk.valueOf(string); + } + + /** + * Converts the given {@code string} to a {@link Confidence} value. + * + * @param string the string to be converted to a {@link Confidence} value. + * @return the {@code Confidence} value converted from the {@code string}, or null if {@code + * string} is {@code null}. + */ + private static Confidence stringToConfidence(String string) { + if (string == null) { + return null; + } + if ("False Positive".equalsIgnoreCase(string)) { + return Confidence.FalsePositive; + } + return Confidence.valueOf(string); + } + + /** + * Gets the ID of the alert. + * + * @return the ID of the alert. + * @since 1.1.0 + */ + public String getId() { + return id; + } + + /** + * Gets the ID of the plugin/scanner that raised the alert. + * + * @return the ID of the plugin/scanner that raised the alert. + * @since 1.1.0 + */ + public String getPluginId() { + return pluginId; + } + + /** + * Gets the ID of the HTTP message of the alert. + * + * @return the ID of the HTTP message. + * @since 1.1.0 + */ + public String getMessageId() { + return messageId; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @since 1.1.0 + */ + public String getName() { + return name; + } + + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @since 1.1.0 + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the name of the alert. + * + * @return the name of the alert + * @deprecated (1.1.0) Use {@link #getName()} instead. + */ + @Deprecated + public String getAlert() { + return name; + } + /** + * Sets the name of the alert. + * + * @param name the name of the alert + * @deprecated (1.1.0) Use {@link #setName(String)} instead. + */ + @Deprecated + public void setAlert(String name) { + this.name = name; + } + + public Risk getRisk() { + return risk; + } + + public void setRisk(Risk risk) { + this.risk = risk; + } + + public void setRisk(String risk) { + this.risk = Risk.valueOf(risk); + } + /** + * @deprecated {@link #getConfidence()} Use of reliability has been deprecated in favour of + * using confidence + */ + @Deprecated + public Reliability getReliability() { + return reliability; + } + /** + * @deprecated {@link #setConfidence(Confidence)} Use of reliability has been deprecated in + * favour of using confidence + */ + @Deprecated + public void setReliability(Reliability reliability) { + this.reliability = reliability; + } + /** + * @deprecated {@link #setConfidence(String)} Use of reliability has been deprecated in favour + * of using confidence + */ + @Deprecated + public void setReliability(String reliability) { + this.reliability = Reliability.valueOf(reliability); + } + + public Confidence getConfidence() { + return confidence; + } + + public void setConfidence(Confidence confidence) { + this.confidence = confidence; + } + + public void setConfidence(String confidence) { + this.confidence = Confidence.valueOf(confidence); + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } + + public String getParam() { + return param; + } + + public void setParam(String param) { + this.param = param; + } public String getAttack() { return attack; @@ -341,165 +384,165 @@ public String getSolution() { return solution; } - public String getEvidence() { - return evidence; - } - - public int getCweId() { - return cweId; - } - - public int getWascId() { - return wascId; - } - - public boolean matches (Alert alertFilter) { - boolean matches = true; - if (alertFilter.getName() != null && ! alertFilter.getName().equals(name) ) { - matches = false; - } - if (alertFilter.getRisk() != null && ! alertFilter.getRisk().equals(risk) ) { - matches = false; - } - if (alertFilter.getConfidence() != null && ! alertFilter.getConfidence().equals(confidence) ) { - matches = false; - } - - return matches; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((attack == null) ? 0 : attack.hashCode()); - result = prime * result + cweId; - result = prime * result + ((description == null) ? 0 : description.hashCode()); - result = prime * result + ((evidence == null) ? 0 : evidence.hashCode()); - result = prime * result + ((other == null) ? 0 : other.hashCode()); - result = prime * result + ((param == null) ? 0 : param.hashCode()); - result = prime * result + ((reference == null) ? 0 : reference.hashCode()); - result = prime * result + ((confidence == null) ? 0 : confidence.hashCode()); - result = prime * result + ((risk == null) ? 0 : risk.hashCode()); - result = prime * result + ((solution == null) ? 0 : solution.hashCode()); - result = prime * result + ((url == null) ? 0 : url.hashCode()); - result = prime * result + wascId; - return result; - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object == null) { - return false; - } - if (getClass() != object.getClass()) { - return false; - } - Alert otherAlert = (Alert) object; - if (name == null) { - if (otherAlert.name != null) { - return false; - } - } else if (!name.equals(otherAlert.name)) { - return false; - } - if (attack == null) { - if (otherAlert.attack != null) { - return false; - } - } else if (!attack.equals(otherAlert.attack)) { - return false; - } - if (cweId != otherAlert.cweId) { - return false; - } - if (description == null) { - if (otherAlert.description != null) { - return false; - } - } else if (!description.equals(otherAlert.description)) { - return false; - } - if (evidence == null) { - if (otherAlert.evidence != null) { - return false; - } - } else if (!evidence.equals(otherAlert.evidence)) { - return false; - } - if (this.other == null) { - if (otherAlert.other != null) { - return false; - } - } else if (!this.other.equals(otherAlert.other)) { - return false; - } - if (param == null) { - if (otherAlert.param != null) { - return false; - } - } else if (!param.equals(otherAlert.param)) { - return false; - } - if (reference == null) { - if (otherAlert.reference != null) { - return false; - } - } else if (!reference.equals(otherAlert.reference)) { - return false; - } - if (confidence != otherAlert.confidence) { - return false; - } - if (risk != otherAlert.risk) { - return false; - } - if (solution == null) { - if (otherAlert.solution != null) { - return false; - } - } else if (!solution.equals(otherAlert.solution)) { - return false; - } - if (url == null) { - if (otherAlert.url != null) { - return false; - } - } else if (!url.equals(otherAlert.url)) { - return false; - } - if (wascId != otherAlert.wascId) { - return false; - } - return true; - } + public String getEvidence() { + return evidence; + } + + public int getCweId() { + return cweId; + } + + public int getWascId() { + return wascId; + } + + public boolean matches(Alert alertFilter) { + boolean matches = true; + if (alertFilter.getName() != null && !alertFilter.getName().equals(name)) { + matches = false; + } + if (alertFilter.getRisk() != null && !alertFilter.getRisk().equals(risk)) { + matches = false; + } + if (alertFilter.getConfidence() != null + && !alertFilter.getConfidence().equals(confidence)) { + matches = false; + } + + return matches; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((attack == null) ? 0 : attack.hashCode()); + result = prime * result + cweId; + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((evidence == null) ? 0 : evidence.hashCode()); + result = prime * result + ((other == null) ? 0 : other.hashCode()); + result = prime * result + ((param == null) ? 0 : param.hashCode()); + result = prime * result + ((reference == null) ? 0 : reference.hashCode()); + result = prime * result + ((confidence == null) ? 0 : confidence.hashCode()); + result = prime * result + ((risk == null) ? 0 : risk.hashCode()); + result = prime * result + ((solution == null) ? 0 : solution.hashCode()); + result = prime * result + ((url == null) ? 0 : url.hashCode()); + result = prime * result + wascId; + return result; + } @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("\tAlert: ").append(getAlert()).append(", "); - sb.append("Risk: "); - if (getRisk() != null) { - sb.append(getRisk().name()); - } else { - sb.append("null"); - } - sb.append(", "); - sb.append("Confidence: "); - if (getConfidence() != null) { - sb.append(getConfidence().name()); - } else { - sb.append("null"); - } - sb.append(", "); - sb.append("Url: ").append(getUrl()).append(", "); - sb.append("Param: ").append(getParam()).append(", "); - sb.append("Other: ").append(getOther()); - return sb.toString(); - } - + public boolean equals(Object object) { + if (this == object) { + return true; + } + if (object == null) { + return false; + } + if (getClass() != object.getClass()) { + return false; + } + Alert otherAlert = (Alert) object; + if (name == null) { + if (otherAlert.name != null) { + return false; + } + } else if (!name.equals(otherAlert.name)) { + return false; + } + if (attack == null) { + if (otherAlert.attack != null) { + return false; + } + } else if (!attack.equals(otherAlert.attack)) { + return false; + } + if (cweId != otherAlert.cweId) { + return false; + } + if (description == null) { + if (otherAlert.description != null) { + return false; + } + } else if (!description.equals(otherAlert.description)) { + return false; + } + if (evidence == null) { + if (otherAlert.evidence != null) { + return false; + } + } else if (!evidence.equals(otherAlert.evidence)) { + return false; + } + if (this.other == null) { + if (otherAlert.other != null) { + return false; + } + } else if (!this.other.equals(otherAlert.other)) { + return false; + } + if (param == null) { + if (otherAlert.param != null) { + return false; + } + } else if (!param.equals(otherAlert.param)) { + return false; + } + if (reference == null) { + if (otherAlert.reference != null) { + return false; + } + } else if (!reference.equals(otherAlert.reference)) { + return false; + } + if (confidence != otherAlert.confidence) { + return false; + } + if (risk != otherAlert.risk) { + return false; + } + if (solution == null) { + if (otherAlert.solution != null) { + return false; + } + } else if (!solution.equals(otherAlert.solution)) { + return false; + } + if (url == null) { + if (otherAlert.url != null) { + return false; + } + } else if (!url.equals(otherAlert.url)) { + return false; + } + if (wascId != otherAlert.wascId) { + return false; + } + return true; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("\tAlert: ").append(getAlert()).append(", "); + sb.append("Risk: "); + if (getRisk() != null) { + sb.append(getRisk().name()); + } else { + sb.append("null"); + } + sb.append(", "); + sb.append("Confidence: "); + if (getConfidence() != null) { + sb.append(getConfidence().name()); + } else { + sb.append("null"); + } + sb.append(", "); + sb.append("Url: ").append(getUrl()).append(", "); + sb.append("Param: ").append(getParam()).append(", "); + sb.append("Other: ").append(getOther()); + return sb.toString(); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index 9da1811..8654f75 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -19,6 +19,11 @@ */ package org.zaproxy.clientapi.core; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; @@ -26,39 +31,39 @@ import org.jdom.output.Format; import org.jdom.output.XMLOutputter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - public class AlertsFile { - public static void saveAlertsToFile(List requireAlerts, List reportAlerts, List ignoredAlerts, File outputFile) throws JDOMException, IOException { + public static void saveAlertsToFile( + List requireAlerts, + List reportAlerts, + List ignoredAlerts, + File outputFile) + throws JDOMException, IOException { Element alerts = new Element("alerts"); Document alertsDocument = new Document(alerts); alertsDocument.setRootElement(alerts); - if (reportAlerts.size() > 0){ + if (reportAlerts.size() > 0) { Element alertsFound = new Element("alertsFound"); alertsFound.setAttribute("alertsFound", Integer.toString(reportAlerts.size())); - for (Alert alert : reportAlerts){ - createAlertXMLElements(alertsFound, alert); + for (Alert alert : reportAlerts) { + createAlertXMLElements(alertsFound, alert); } alertsDocument.getRootElement().addContent(alertsFound); } - if (requireAlerts.size() > 0){ + if (requireAlerts.size() > 0) { Element alertsNotFound = new Element("alertsNotFound"); alertsNotFound.setAttribute("alertsNotFound", Integer.toString(requireAlerts.size())); - for (Alert alert : requireAlerts){ + for (Alert alert : requireAlerts) { createAlertXMLElements(alertsNotFound, alert); } alertsDocument.getRootElement().addContent(alertsNotFound); } - if (ignoredAlerts.size() > 0){ + if (ignoredAlerts.size() > 0) { Element ignoredAlertsFound = new Element("ignoredAlertsFound"); - ignoredAlertsFound.setAttribute("ignoredAlertsFound", Integer.toString(ignoredAlerts.size())); - for (Alert alert : ignoredAlerts){ + ignoredAlertsFound.setAttribute( + "ignoredAlertsFound", Integer.toString(ignoredAlerts.size())); + for (Alert alert : ignoredAlerts) { createAlertXMLElements(ignoredAlertsFound, alert); } alertsDocument.getRootElement().addContent(ignoredAlertsFound); @@ -66,7 +71,7 @@ public static void saveAlertsToFile(List requireAlerts, List repor writeAlertsToFile(outputFile, alertsDocument); } - + private static void writeAlertsToFile(File outputFile, Document doc) { XMLOutputter xmlOutput = new XMLOutputter(); @@ -74,7 +79,7 @@ private static void writeAlertsToFile(File outputFile, Document doc) { xmlOutput.setFormat(Format.getPrettyFormat()); try { xmlOutput.output(doc, new FileWriter(outputFile)); - System.out.println("alert xml report saved to: "+outputFile.getAbsolutePath()); + System.out.println("alert xml report saved to: " + outputFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } @@ -87,46 +92,42 @@ private static void createAlertXMLElements(Element alertsFound, Alert alert) { // TODO Remove once alert attribute is no longer supported. alertElement.setAttribute("alert", alert.getName()); } - if (alert.getRisk() != null) - alertElement.setAttribute("risk", alert.getRisk().name()); + if (alert.getRisk() != null) alertElement.setAttribute("risk", alert.getRisk().name()); if (alert.getUrl() != null) alertElement.setAttribute("confidence", alert.getConfidence().name()); - if (alert.getUrl() != null) - alertElement.setAttribute("url", alert.getUrl()); - if (alert.getParam() != null) - alertElement.setAttribute("param", alert.getParam()); - if (alert.getOther() != null) - alertElement.setAttribute("other", alert.getOther()); - if (alert.getAttack() != null) - alertElement.setAttribute("attack", alert.getAttack()); + if (alert.getUrl() != null) alertElement.setAttribute("url", alert.getUrl()); + if (alert.getParam() != null) alertElement.setAttribute("param", alert.getParam()); + if (alert.getOther() != null) alertElement.setAttribute("other", alert.getOther()); + if (alert.getAttack() != null) alertElement.setAttribute("attack", alert.getAttack()); if (alert.getDescription() != null) alertElement.setAttribute("description", alert.getDescription()); - if (alert.getSolution() != null) - alertElement.setAttribute("solution", alert.getSolution()); + if (alert.getSolution() != null) alertElement.setAttribute("solution", alert.getSolution()); if (alert.getReference() != null) alertElement.setAttribute("reference", alert.getReference()); alertsFound.addContent(alertElement); } - public static List getAlertsFromFile(File file, String alertType) throws JDOMException, IOException { - List alerts = new ArrayList<>(); + public static List getAlertsFromFile(File file, String alertType) + throws JDOMException, IOException { + List alerts = new ArrayList<>(); SAXBuilder parser = new SAXBuilder(); Document alertsDoc = parser.build(file); @SuppressWarnings("unchecked") List alertElements = alertsDoc.getRootElement().getChildren(alertType); - for (Element element: alertElements){ + for (Element element : alertElements) { String name = element.getAttributeValue("name"); if (name == null) { // TODO Remove once alert attribute is no longer supported. name = element.getAttributeValue("alert"); } - Alert alert = new Alert( - name, - element.getAttributeValue("url"), - element.getAttributeValue("risk"), - element.getAttributeValue("confidence"), - element.getAttributeValue("param"), - element.getAttributeValue("other")); + Alert alert = + new Alert( + name, + element.getAttributeValue("url"), + element.getAttributeValue("risk"), + element.getAttributeValue("confidence"), + element.getAttributeValue("param"), + element.getAttributeValue("other")); alerts.add(alert); } return alerts; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java index 41a9580..9db5608 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponse.java @@ -19,24 +19,22 @@ */ package org.zaproxy.clientapi.core; - public abstract class ApiResponse { - private String name = null; - - public ApiResponse(String name) { - super(); - this.name = name; - } + private String name = null; - public String getName() { - return name; - } + public ApiResponse(String name) { + super(); + this.name = name; + } - public void setName(String name) { - this.name = name; - } + public String getName() { + return name; + } - public abstract String toString(int indent); + public void setName(String name) { + this.name = name; + } + public abstract String toString(int indent); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java index 84ef674..44a8eca 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseElement.java @@ -22,52 +22,51 @@ import org.w3c.dom.Node; public class ApiResponseElement extends ApiResponse { - - public static ApiResponseElement OK = new ApiResponseElement("Result", "OK"); - public static ApiResponseElement FAIL = new ApiResponseElement("Result", "FAIL"); - - private String value = null; - public ApiResponseElement(String name) { - super(name); - } + public static ApiResponseElement OK = new ApiResponseElement("Result", "OK"); + public static ApiResponseElement FAIL = new ApiResponseElement("Result", "FAIL"); - public ApiResponseElement(String name, String value) { - super(name); - this.value = value; - } + private String value = null; - public ApiResponseElement(Node node, ApiResponse template) { - super(node.getNodeName()); - this.value = node.getTextContent(); + public ApiResponseElement(String name) { + super(name); + } - } + public ApiResponseElement(String name, String value) { + super(name); + this.value = value; + } - public ApiResponseElement(Node node) { - super(node.getNodeName()); - this.value = node.getTextContent(); - } + public ApiResponseElement(Node node, ApiResponse template) { + super(node.getNodeName()); + this.value = node.getTextContent(); + } - public String getValue() { - return value; - } + public ApiResponseElement(Node node) { + super(node.getNodeName()); + this.value = node.getTextContent(); + } - @Override - public String toString(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0 ; i < indent; i++) { - sb.append("\t"); - } - sb.append("ApiResponseElement "); - sb.append(this.getName()); - sb.append(" = " ); - sb.append(this.getValue()); - sb.append("\n"); - return sb.toString(); - } + public String getValue() { + return value; + } - @Override - public String toString() { - return getValue(); - } + @Override + public String toString(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append("\t"); + } + sb.append("ApiResponseElement "); + sb.append(this.getName()); + sb.append(" = "); + sb.append(this.getValue()); + sb.append("\n"); + return sb.toString(); + } + + @Override + public String toString() { + return getValue(); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java index 051c965..03fd374 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseFactory.java @@ -23,35 +23,33 @@ import org.w3c.dom.Node; public final class ApiResponseFactory { - - private ApiResponseFactory() { - } - - public static ApiResponse getResponse(Node node) throws ClientApiException { - if (node == null) { - throw new ClientApiException("Null node"); - } - Node typeNode = node.getAttributes().getNamedItem("type"); - if (typeNode != null) { - String type = typeNode.getNodeValue(); - if ("list".equals(type)) { - return new ApiResponseList(node); - } - if ("set".equals(type)) { - return new ApiResponseSet(node); - } - if ("exception".equals(type)) { - NamedNodeMap atts = node.getAttributes(); - String code = atts.getNamedItem("code").getNodeValue(); - String detail = null; - if (atts.getNamedItem("detail") != null) { - detail = atts.getNamedItem("detail").getNodeValue(); - } - throw new ClientApiException(node.getTextContent(), code, detail); - } - } - return new ApiResponseElement(node); - } + private ApiResponseFactory() {} + public static ApiResponse getResponse(Node node) throws ClientApiException { + if (node == null) { + throw new ClientApiException("Null node"); + } + Node typeNode = node.getAttributes().getNamedItem("type"); + if (typeNode != null) { + String type = typeNode.getNodeValue(); + if ("list".equals(type)) { + return new ApiResponseList(node); + } + if ("set".equals(type)) { + return new ApiResponseSet(node); + } + if ("exception".equals(type)) { + NamedNodeMap atts = node.getAttributes(); + + String code = atts.getNamedItem("code").getNodeValue(); + String detail = null; + if (atts.getNamedItem("detail") != null) { + detail = atts.getNamedItem("detail").getNodeValue(); + } + throw new ClientApiException(node.getTextContent(), code, detail); + } + } + return new ApiResponseElement(node); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java index ad587c0..47f6185 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java @@ -22,94 +22,90 @@ import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; - import org.w3c.dom.Node; public class ApiResponseList extends ApiResponse { - - private List list = null; - public ApiResponseList(String name) { - super(name); - this.list = new ArrayList(); - } + private List list = null; + + public ApiResponseList(String name) { + super(name); + this.list = new ArrayList(); + } + + public ApiResponseList(Node node) throws ClientApiException { + this(node.getNodeName()); + Node child = node.getFirstChild(); + while (child != null) { + this.addItem(ApiResponseFactory.getResponse(child)); + child = child.getNextSibling(); + } + } + + public ApiResponseList(Node node, ApiResponseList template) throws ClientApiException { + super(node.getNodeName()); + try { + this.list = new ArrayList(); + Class clazz = template.getItemsClass(); + if (clazz != null) { - public ApiResponseList(Node node) - throws ClientApiException { - this(node.getNodeName()); - Node child = node.getFirstChild(); - while (child != null) { - this.addItem(ApiResponseFactory.getResponse(child)); - child = child.getNextSibling(); - } - } + Node child = node.getFirstChild(); + while (child != null) { + Constructor cons = + clazz.getConstructor(Node.class, ApiResponse.class); + this.addItem(cons.newInstance(child, template.list.get(0))); + child = child.getNextSibling(); + } + } + } catch (Exception e) { + throw new ClientApiException(e); + } + } - public ApiResponseList(Node node, ApiResponseList template) - throws ClientApiException { - super(node.getNodeName()); - try { - this.list = new ArrayList(); - Class clazz = template.getItemsClass(); - if (clazz != null) { + public ApiResponseList(String name, ApiResponse[] array) { + super(name); + this.list = new ArrayList(); + for (ApiResponse resp : array) { + list.add(resp); + } + } - Node child = node.getFirstChild(); - while (child != null) { - Constructor cons = clazz.getConstructor(Node.class, ApiResponse.class); - this.addItem(cons.newInstance(child, template.list.get(0))); - child = child.getNextSibling(); - } - } - } catch (Exception e) { - throw new ClientApiException(e); - } - } + public ApiResponseList(String name, List list) { + super(name); + this.list = list; + } - public ApiResponseList(String name, ApiResponse[] array) { - super(name); - this.list = new ArrayList(); - for (ApiResponse resp: array) { - list.add(resp); - } - } + public void addItem(ApiResponse item) { + this.list.add(item); + } - public ApiResponseList(String name, List list) { - super(name); - this.list = list; - } - - public void addItem(ApiResponse item) { - this.list.add(item); - } - - public List getItems() { - return this.list; - } - - public Class getItemsClass() { - if (this.list == null || this.list.size() == 0) { - return null; - } - return this.list.get(0).getClass(); - } + public List getItems() { + return this.list; + } - @Override - public String toString(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0 ; i < indent; i++) { - sb.append("\t"); - } - sb.append("ApiResponseList "); - sb.append(this.getName()); - sb.append(" : [\n"); - for (ApiResponse resp: this.list) { - sb.append(resp.toString(indent+1)); - } - for (int i=0 ; i < indent; i++) { - sb.append("\t"); - } - sb.append("]\n"); - return sb.toString(); - } + public Class getItemsClass() { + if (this.list == null || this.list.size() == 0) { + return null; + } + return this.list.get(0).getClass(); + } - + @Override + public String toString(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append("\t"); + } + sb.append("ApiResponseList "); + sb.append(this.getName()); + sb.append(" : [\n"); + for (ApiResponse resp : this.list) { + sb.append(resp.toString(indent + 1)); + } + for (int i = 0; i < indent; i++) { + sb.append("\t"); + } + sb.append("]\n"); + return sb.toString(); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java index a5c338e..c3dd2c8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseSet.java @@ -25,176 +25,173 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; - import org.w3c.dom.Node; public class ApiResponseSet extends ApiResponse { - - private String[] attributes = null; - private final Map valuesMap; - /** - * Constructs an {@code ApiResponseSet} with the given name and attributes. - * - * @param name the name of the API response - * @param attributes the attributes - * @deprecated (1.1.0) Unused, there's no replacement. - */ - @Deprecated - public ApiResponseSet(String name, String[] attributes) { - super(name); - this.attributes = attributes; - this.valuesMap = Collections.emptyMap(); - } + private String[] attributes = null; + private final Map valuesMap; + + /** + * Constructs an {@code ApiResponseSet} with the given name and attributes. + * + * @param name the name of the API response + * @param attributes the attributes + * @deprecated (1.1.0) Unused, there's no replacement. + */ + @Deprecated + public ApiResponseSet(String name, String[] attributes) { + super(name); + this.attributes = attributes; + this.valuesMap = Collections.emptyMap(); + } - public ApiResponseSet(String name, Map values) { - super(name); - this.valuesMap = Collections.unmodifiableMap(new HashMap<>(values)); - } + public ApiResponseSet(String name, Map values) { + super(name); + this.valuesMap = Collections.unmodifiableMap(new HashMap<>(values)); + } - public ApiResponseSet(Node node) throws ClientApiException { - super(node.getNodeName()); - Node child = node.getFirstChild(); - Map values = new HashMap<>(); - while (child != null) { - ApiResponse elem = ApiResponseFactory.getResponse(child); - values.put(elem.getName(), elem); - child = child.getNextSibling(); - } - this.valuesMap = Collections.unmodifiableMap(values); - } + public ApiResponseSet(Node node) throws ClientApiException { + super(node.getNodeName()); + Node child = node.getFirstChild(); + Map values = new HashMap<>(); + while (child != null) { + ApiResponse elem = ApiResponseFactory.getResponse(child); + values.put(elem.getName(), elem); + child = child.getNextSibling(); + } + this.valuesMap = Collections.unmodifiableMap(values); + } - /** - * Gets the attributes. - * - * @return the attributes, might be {@code null}. - * @deprecated (1.1.0) Unused, there's no replacement. - * @see #getValues() - */ - @Deprecated - public String[] getAttributes() { - return attributes; - } - - /** - * Gets the value for the given {@code key}. - * - * @param key the key of the value - * @return the value, or {@code null} if no value exists for the given {@code key}. - * @deprecated (1.1.0) Use {@link #getStringValue(String)} or {@link #getValue(String)} instead. - */ - @Deprecated - public String getAttribute(String key) { - return getStringValue(key); - } + /** + * Gets the attributes. + * + * @return the attributes, might be {@code null}. + * @deprecated (1.1.0) Unused, there's no replacement. + * @see #getValues() + */ + @Deprecated + public String[] getAttributes() { + return attributes; + } - /** - * Gets the value for the given {@code key}. - * - * @param key the key of the value - * @return the value, or {@code null} if no value exists for the given {@code key}. - * @since 1.1.0 - * @see #getKeys() - * @see #getStringValue(String) - */ - public ApiResponse getValue(String key) { - return valuesMap.get(key); - } + /** + * Gets the value for the given {@code key}. + * + * @param key the key of the value + * @return the value, or {@code null} if no value exists for the given {@code key}. + * @deprecated (1.1.0) Use {@link #getStringValue(String)} or {@link #getValue(String)} instead. + */ + @Deprecated + public String getAttribute(String key) { + return getStringValue(key); + } - /** - * Gets the value for the given {@code key} as {@code String}. - *

- * For {@link ApiResponseElement}s it returns {@link ApiResponseElement#getValue() its value}, for other {@link ApiResponse} - * types it returns the conversion to {@code String}. - * - * @param key the key of the value - * @return the value, or {@code null} if no value exists for the given {@code key}. - * @since 1.1.0 - * @see #getKeys() - * @see #getValue(String) - */ - public String getStringValue(String key) { - ApiResponse value = valuesMap.get(key); - if (value instanceof ApiResponseElement) { - return ((ApiResponseElement) value).getValue(); - } - return value != null ? value.toString() : null; - } + /** + * Gets the value for the given {@code key}. + * + * @param key the key of the value + * @return the value, or {@code null} if no value exists for the given {@code key}. + * @since 1.1.0 + * @see #getKeys() + * @see #getStringValue(String) + */ + public ApiResponse getValue(String key) { + return valuesMap.get(key); + } - /** - * Gets a {@code Map} with the keys and values. - *

- * The returned {@code Map} is unmodifiable, any attempt to modify it will result in an - * {@code UnsupportedOperationException}. - * - * @return the map with the keys/values, never {@code null}. - * @since 1.1.0 - */ - public Map getValuesMap() { - return valuesMap; - } + /** + * Gets the value for the given {@code key} as {@code String}. + * + *

For {@link ApiResponseElement}s it returns {@link ApiResponseElement#getValue() its + * value}, for other {@link ApiResponse} types it returns the conversion to {@code String}. + * + * @param key the key of the value + * @return the value, or {@code null} if no value exists for the given {@code key}. + * @since 1.1.0 + * @see #getKeys() + * @see #getValue(String) + */ + public String getStringValue(String key) { + ApiResponse value = valuesMap.get(key); + if (value instanceof ApiResponseElement) { + return ((ApiResponseElement) value).getValue(); + } + return value != null ? value.toString() : null; + } - /** - * Gets the keys of the values. - *

- * The returned {@code Set} is unmodifiable, any attempt to modify it will result in an - * {@code UnsupportedOperationException}. - * - * @return the keys, never {@code null}. - * @since 1.1.0 - * @see #getValue(String) - * @see #getStringValue(String) - * @see #getValues() - * @see #getValuesMap() - */ - public Set getKeys() { - return valuesMap.keySet(); - } + /** + * Gets a {@code Map} with the keys and values. + * + *

The returned {@code Map} is unmodifiable, any attempt to modify it will result in an + * {@code UnsupportedOperationException}. + * + * @return the map with the keys/values, never {@code null}. + * @since 1.1.0 + */ + public Map getValuesMap() { + return valuesMap; + } - /** - * Gets the values. - *

- * The returned {@code Collection} is unmodifiable, any attempt to modify it will result in an - * {@code UnsupportedOperationException}. - * - * @return the values, never {@code null}. - * @since 1.1.0 - * @see #getValue(String) - * @see #getStringValue(String) - */ - public Collection getValues() { - return valuesMap.values(); - } + /** + * Gets the keys of the values. + * + *

The returned {@code Set} is unmodifiable, any attempt to modify it will result in an + * {@code UnsupportedOperationException}. + * + * @return the keys, never {@code null}. + * @since 1.1.0 + * @see #getValue(String) + * @see #getStringValue(String) + * @see #getValues() + * @see #getValuesMap() + */ + public Set getKeys() { + return valuesMap.keySet(); + } - @Override - public String toString(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i=0 ; i < indent; i++) { - sb.append("\t"); - } - sb.append("ApiResponseSet "); - sb.append(this.getName()); - sb.append(" : [\n"); - for (Entry val : valuesMap.entrySet()) { - for (int i=0 ; i < indent+1; i++) { - sb.append("\t"); - } - sb.append(val.getKey()); - sb.append(" = "); - if (val.getValue() instanceof ApiResponseElement) { - sb.append(val.getValue()); - } else { - sb.append('\n'); - sb.append(val.getValue().toString(indent + 2)); - } - sb.append("\n"); - } - for (int i=0 ; i < indent; i++) { - sb.append("\t"); - } - sb.append("]\n"); - return sb.toString(); - } + /** + * Gets the values. + * + *

The returned {@code Collection} is unmodifiable, any attempt to modify it will result in + * an {@code UnsupportedOperationException}. + * + * @return the values, never {@code null}. + * @since 1.1.0 + * @see #getValue(String) + * @see #getStringValue(String) + */ + public Collection getValues() { + return valuesMap.values(); + } - + @Override + public String toString(int indent) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < indent; i++) { + sb.append("\t"); + } + sb.append("ApiResponseSet "); + sb.append(this.getName()); + sb.append(" : [\n"); + for (Entry val : valuesMap.entrySet()) { + for (int i = 0; i < indent + 1; i++) { + sb.append("\t"); + } + sb.append(val.getKey()); + sb.append(" = "); + if (val.getValue() instanceof ApiResponseElement) { + sb.append(val.getValue()); + } else { + sb.append('\n'); + sb.append(val.getValue().toString(indent + 2)); + } + sb.append("\n"); + } + for (int i = 0; i < indent; i++) { + sb.append("\t"); + } + sb.append("]\n"); + return sb.toString(); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 720cd6e..d5d9f43 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -42,10 +42,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; - import org.w3c.dom.Document; import org.zaproxy.clientapi.gen.Acsrf; import org.zaproxy.clientapi.gen.AjaxSpider; @@ -77,111 +75,115 @@ public class ClientApi { - private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; - - private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; - private static final String ZAP_API_KEY_PARAM = "apikey"; - - private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); - private boolean debug = false; - private PrintStream debugStream = System.out; - - private final String zapAddress; - private final int zapPort; - - private final String apiKey; - - // Note that any new API implementations added have to be added here manually - public Acsrf acsrf = new Acsrf(this); - public AjaxSpider ajaxSpider = new AjaxSpider(this); - public AlertFilter alertFilter = new AlertFilter(this); - public Ascan ascan = new Ascan(this); - public Authentication authentication = new Authentication(this); - public Authorization authorization = new Authorization(this); - public Autoupdate autoupdate = new Autoupdate(this); - public Break brk = new Break(this); - public Context context = new Context(this); - public Core core = new Core(this); - public ForcedUser forcedUser = new ForcedUser(this); - public HttpSessions httpSessions = new HttpSessions(this); - public ImportLogFiles logImportFiles = new ImportLogFiles(this); - public Importurls importurls = new Importurls(this); - public Openapi openapi = new Openapi(this); - public Params params = new Params(this); - public Pnh pnh = new Pnh(this); - public Pscan pscan = new Pscan(this); - public Replacer replacer = new Replacer(this); - public Reveal reveal = new Reveal(this); - public Search search = new Search(this); - public Script script = new Script(this); - public Selenium selenium = new Selenium(this); - public SessionManagement sessionManagement = new SessionManagement(this); - public Spider spider = new Spider(this); - public Stats stats = new Stats(this); - public Users users = new Users(this); - - public ClientApi (String zapAddress, int zapPort) { - this(zapAddress, zapPort, false); - } - - /** - * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API - * requests. - * - * @param zapAddress ZAP's address - * @param zapPort ZAP's listening port - * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. - * @since 1.1.0 - */ - public ClientApi(String zapAddress, int zapPort, String apiKey) { - this(zapAddress, zapPort, apiKey, false); - } - - public ClientApi (String zapAddress, int zapPort, boolean debug) { - this(zapAddress, zapPort, null, debug); - } - - /** - * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to be sent with all API - * requests. Also, sets whether or not client API debug information should be written to the - * {@link #setDebugStream(PrintStream) debug stream} (by default the standard output stream). - * - * @param zapAddress ZAP's address - * @param zapPort ZAP's listening port - * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. - * @param debug {@code true} if debug information should be written to debug stream, {@code false} otherwise. - * @since 1.1.0 - */ - public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { - proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); - this.debug = debug; - this.zapAddress = zapAddress; - this.zapPort = zapPort; - this.apiKey = apiKey; - } - - public void setDebugStream(PrintStream debugStream) { - this.debugStream = debugStream; - } - - public void accessUrl (String url) throws ClientApiException { - accessUrlViaProxy(proxy, url); - } - - private int statusToInt(ApiResponse response) { - return Integer.parseInt(((ApiResponseElement)response).getValue()); - } - - public void checkAlerts (List ignoreAlerts, List requireAlerts) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; + + private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; + private static final String ZAP_API_KEY_PARAM = "apikey"; + + private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); + private boolean debug = false; + private PrintStream debugStream = System.out; + + private final String zapAddress; + private final int zapPort; + + private final String apiKey; + + // Note that any new API implementations added have to be added here manually + public Acsrf acsrf = new Acsrf(this); + public AjaxSpider ajaxSpider = new AjaxSpider(this); + public AlertFilter alertFilter = new AlertFilter(this); + public Ascan ascan = new Ascan(this); + public Authentication authentication = new Authentication(this); + public Authorization authorization = new Authorization(this); + public Autoupdate autoupdate = new Autoupdate(this); + public Break brk = new Break(this); + public Context context = new Context(this); + public Core core = new Core(this); + public ForcedUser forcedUser = new ForcedUser(this); + public HttpSessions httpSessions = new HttpSessions(this); + public ImportLogFiles logImportFiles = new ImportLogFiles(this); + public Importurls importurls = new Importurls(this); + public Openapi openapi = new Openapi(this); + public Params params = new Params(this); + public Pnh pnh = new Pnh(this); + public Pscan pscan = new Pscan(this); + public Replacer replacer = new Replacer(this); + public Reveal reveal = new Reveal(this); + public Search search = new Search(this); + public Script script = new Script(this); + public Selenium selenium = new Selenium(this); + public SessionManagement sessionManagement = new SessionManagement(this); + public Spider spider = new Spider(this); + public Stats stats = new Stats(this); + public Users users = new Users(this); + + public ClientApi(String zapAddress, int zapPort) { + this(zapAddress, zapPort, false); + } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to + * be sent with all API requests. + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @since 1.1.0 + */ + public ClientApi(String zapAddress, int zapPort, String apiKey) { + this(zapAddress, zapPort, apiKey, false); + } + + public ClientApi(String zapAddress, int zapPort, boolean debug) { + this(zapAddress, zapPort, null, debug); + } + + /** + * Constructs a {@code ClientApi} with the given ZAP address/port and with the given API key, to + * be sent with all API requests. Also, sets whether or not client API debug information should + * be written to the {@link #setDebugStream(PrintStream) debug stream} (by default the standard + * output stream). + * + * @param zapAddress ZAP's address + * @param zapPort ZAP's listening port + * @param apiKey the ZAP API key, might be {@code null} or empty in which case is not used/sent. + * @param debug {@code true} if debug information should be written to debug stream, {@code + * false} otherwise. + * @since 1.1.0 + */ + public ClientApi(String zapAddress, int zapPort, String apiKey, boolean debug) { + proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(zapAddress, zapPort)); + this.debug = debug; + this.zapAddress = zapAddress; + this.zapPort = zapPort; + this.apiKey = apiKey; + } + + public void setDebugStream(PrintStream debugStream) { + this.debugStream = debugStream; + } + + public void accessUrl(String url) throws ClientApiException { + accessUrlViaProxy(proxy, url); + } + + private int statusToInt(ApiResponse response) { + return Integer.parseInt(((ApiResponseElement) response).getValue()); + } + + public void checkAlerts(List ignoreAlerts, List requireAlerts) + throws ClientApiException { + HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); verifyAlerts(results.get("requireAlerts"), results.get("reportAlerts")); - } + } - private void verifyAlerts(List requireAlerts, List reportAlerts) throws ClientApiException { + private void verifyAlerts(List requireAlerts, List reportAlerts) + throws ClientApiException { StringBuilder sb = new StringBuilder(); if (reportAlerts.size() > 0) { sb.append("Found ").append(reportAlerts.size()).append(" alerts\n"); - for (Alert alert: reportAlerts) { + for (Alert alert : reportAlerts) { sb.append('\t'); sb.append(alert.toString()); sb.append('\n'); @@ -192,7 +194,7 @@ private void verifyAlerts(List requireAlerts, List reportAlerts) t sb.append('\n'); } sb.append("Not found ").append(requireAlerts.size()).append(" alerts\n"); - for (Alert alert: requireAlerts) { + for (Alert alert : requireAlerts) { sb.append('\t'); sb.append(alert.toString()); sb.append('\n'); @@ -202,43 +204,52 @@ private void verifyAlerts(List requireAlerts, List reportAlerts) t if (debug) { debugStream.println("Failed: " + sb.toString()); } - throw new ClientApiException (sb.toString()); + throw new ClientApiException(sb.toString()); } } - public void checkAlerts(List ignoreAlerts, List requireAlerts, File outputFile) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + public void checkAlerts(List ignoreAlerts, List requireAlerts, File outputFile) + throws ClientApiException { + HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); int alertsFound = results.get("reportAlerts").size(); int alertsNotFound = results.get("requireAlerts").size(); int alertsIgnored = results.get("ignoredAlerts").size(); - String resultsString = String.format("Alerts Found: %d, Alerts required but not found: %d, Alerts ignored: %d", alertsFound, alertsNotFound, alertsIgnored); + String resultsString = + String.format( + "Alerts Found: %d, Alerts required but not found: %d, Alerts ignored: %d", + alertsFound, alertsNotFound, alertsIgnored); try { - AlertsFile.saveAlertsToFile(results.get("requireAlerts"), results.get("reportAlerts"), results.get("ignoredAlerts"), outputFile); - } catch (Exception e) { - throw new ClientApiException (e); - } - if (alertsFound>0 || alertsNotFound>0){ - throw new ClientApiException("Check Alerts Failed!\n"+resultsString); - }else{ - if (debug) { - debugStream.println("Check Alerts Passed!\n" + resultsString); - } + AlertsFile.saveAlertsToFile( + results.get("requireAlerts"), + results.get("reportAlerts"), + results.get("ignoredAlerts"), + outputFile); + } catch (Exception e) { + throw new ClientApiException(e); + } + if (alertsFound > 0 || alertsNotFound > 0) { + throw new ClientApiException("Check Alerts Failed!\n" + resultsString); + } else { + if (debug) { + debugStream.println("Check Alerts Passed!\n" + resultsString); + } } } public List getAlerts(String baseUrl, int start, int count) throws ClientApiException { - List alerts = new ArrayList(); + List alerts = new ArrayList(); ApiResponse response = core.alerts(baseUrl, String.valueOf(start), String.valueOf(count)); if (response != null && response instanceof ApiResponseList) { - ApiResponseList alertList = (ApiResponseList)response; + ApiResponseList alertList = (ApiResponseList) response; for (ApiResponse resp : alertList.getItems()) { alerts.add(new Alert((ApiResponseSet) resp)); } } - return alerts; + return alerts; } - private HashMap> checkForAlerts(List ignoreAlerts, List requireAlerts) throws ClientApiException { + private HashMap> checkForAlerts( + List ignoreAlerts, List requireAlerts) throws ClientApiException { List reportAlerts = new ArrayList<>(); List ignoredAlerts = new ArrayList<>(); List alerts = getAlerts(null, -1, -1); @@ -256,7 +267,7 @@ private HashMap> checkForAlerts(List ignoreAlerts, Li } } } - if (! ignore) { + if (!ignore) { reportAlerts.add(alert); } if (requireAlerts != null) { @@ -280,106 +291,106 @@ private HashMap> checkForAlerts(List ignoreAlerts, Li return results; } - private void accessUrlViaProxy (Proxy proxy, String apiurl) throws ClientApiException { - try { - URL url = new URL(apiurl); - if (debug) { - debugStream.println("Open URL: " + apiurl); - } - HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy); - uc.connect(); - - BufferedReader in; - try { - in = new BufferedReader(new InputStreamReader(uc.getInputStream())); - String inputLine; - - while ((inputLine = in.readLine()) != null) { - if (debug) { - debugStream.println(inputLine); - } - } - in.close(); - - } catch (IOException e) { - // Ignore - if (debug) { - debugStream.println("Ignoring exception " + e); - } - } - } catch (Exception e) { - throw new ClientApiException (e); - } - } - - public ApiResponse callApi (String component, String type, String method, - Map params) throws ClientApiException { - Document dom = this.callApiDom(component, type, method, params); - return ApiResponseFactory.getResponse(dom.getFirstChild()); - } - - private Document callApiDom (String component, String type, String method, - Map params) throws ClientApiException { - try { - HttpRequest request = buildZapRequest("xml", component, type, method, params); - if (debug) { - debugStream.println("Open URL: " + request.getRequestUri()); - } - //get the factory - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - //Using factory get an instance of document builder - DocumentBuilder db = dbf.newDocumentBuilder(); - //parse using builder to get DOM representation of the XML file - return db.parse(getConnectionInputStream(request)); - } catch (Exception e) { - throw new ClientApiException(e); - } - } - - private InputStream getConnectionInputStream(HttpRequest request) throws IOException { - HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); - for (Entry header : request.getHeaders().entrySet()) { - uc.setRequestProperty(header.getKey(), header.getValue()); - } - uc.connect(); - if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { - return uc.getErrorStream(); - } - return uc.getInputStream(); - } - - public byte[] callApiOther (String component, String type, String method, - Map params) throws ClientApiException { - try { - HttpRequest request = buildZapRequest("other", component, type, method, params); - if (debug) { - debugStream.println("Open URL: " + request.getRequestUri()); - } - InputStream in = getConnectionInputStream(request); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buffer = new byte[8 * 1024]; - try { - int bytesRead; - while ((bytesRead = in.read(buffer)) != -1) { - out.write(buffer, 0, bytesRead); - } - } finally { - out.close(); - in.close(); - } - return out.toByteArray(); - - } catch (Exception e) { - throw new ClientApiException(e); - } - } + private void accessUrlViaProxy(Proxy proxy, String apiurl) throws ClientApiException { + try { + URL url = new URL(apiurl); + if (debug) { + debugStream.println("Open URL: " + apiurl); + } + HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy); + uc.connect(); + + BufferedReader in; + try { + in = new BufferedReader(new InputStreamReader(uc.getInputStream())); + String inputLine; + + while ((inputLine = in.readLine()) != null) { + if (debug) { + debugStream.println(inputLine); + } + } + in.close(); + + } catch (IOException e) { + // Ignore + if (debug) { + debugStream.println("Ignoring exception " + e); + } + } + } catch (Exception e) { + throw new ClientApiException(e); + } + } + + public ApiResponse callApi( + String component, String type, String method, Map params) + throws ClientApiException { + Document dom = this.callApiDom(component, type, method, params); + return ApiResponseFactory.getResponse(dom.getFirstChild()); + } + + private Document callApiDom( + String component, String type, String method, Map params) + throws ClientApiException { + try { + HttpRequest request = buildZapRequest("xml", component, type, method, params); + if (debug) { + debugStream.println("Open URL: " + request.getRequestUri()); + } + // get the factory + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + // Using factory get an instance of document builder + DocumentBuilder db = dbf.newDocumentBuilder(); + // parse using builder to get DOM representation of the XML file + return db.parse(getConnectionInputStream(request)); + } catch (Exception e) { + throw new ClientApiException(e); + } + } + + private InputStream getConnectionInputStream(HttpRequest request) throws IOException { + HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); + for (Entry header : request.getHeaders().entrySet()) { + uc.setRequestProperty(header.getKey(), header.getValue()); + } + uc.connect(); + if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { + return uc.getErrorStream(); + } + return uc.getInputStream(); + } + + public byte[] callApiOther( + String component, String type, String method, Map params) + throws ClientApiException { + try { + HttpRequest request = buildZapRequest("other", component, type, method, params); + if (debug) { + debugStream.println("Open URL: " + request.getRequestUri()); + } + InputStream in = getConnectionInputStream(request); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buffer = new byte[8 * 1024]; + try { + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } finally { + out.close(); + in.close(); + } + return out.toByteArray(); + + } catch (Exception e) { + throw new ClientApiException(e); + } + } private HttpRequest buildZapRequest( - String format, - String component, - String type, - String method, - Map params) throws MalformedURLException { + String format, String component, String type, String method, Map params) + throws MalformedURLException { StringBuilder sb = new StringBuilder(); sb.append("http://zap/"); sb.append(format); @@ -440,7 +451,8 @@ private static String encodeQueryParam(String param) { * @see #context */ @Deprecated - public void addExcludeFromContext(String apikey, String contextName, String regex) throws Exception { + public void addExcludeFromContext(String apikey, String contextName, String regex) + throws Exception { context.excludeFromContext(apikey, contextName, regex); } @@ -455,14 +467,16 @@ public void addExcludeFromContext(String apikey, String contextName, String rege * @see #context */ @Deprecated - public void addIncludeInContext(String apikey, String contextName, String regex) throws Exception { + public void addIncludeInContext(String apikey, String contextName, String regex) + throws Exception { context.includeInContext(apikey, contextName, regex); } /** - * Includes just one of the nodes that match the given regular expression in the context with the given name. - *

- * Nodes that do not match the regular expression are excluded. + * Includes just one of the nodes that match the given regular expression in the context with + * the given name. + * + *

Nodes that do not match the regular expression are excluded. * * @param apikey the API key, might be {@code null}. * @param contextName the name of the context. @@ -471,28 +485,30 @@ public void addIncludeInContext(String apikey, String contextName, String regex) * @deprecated (1.1.0) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. */ @Deprecated - public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) throws Exception { + public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) + throws Exception { List sessionUrls = getSessionUrls(); boolean foundOneMatch = false; - for (String sessionUrl : sessionUrls){ - if (sessionUrl.matches(regex)){ - if (foundOneMatch){ + for (String sessionUrl : sessionUrls) { + if (sessionUrl.matches(regex)) { + if (foundOneMatch) { addExcludeFromContext(apikey, contextName, sessionUrl); } else { foundOneMatch = true; } } } - if(!foundOneMatch){ - throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); + if (!foundOneMatch) { + throw new Exception( + "Unexpected result: No url found in site tree matching regex " + regex); } - } /** - * Includes just one of the nodes that match the given regular expression in the context with the given name. - *

- * Nodes that do not match the regular expression are excluded. + * Includes just one of the nodes that match the given regular expression in the context with + * the given name. + * + *

Nodes that do not match the regular expression are excluded. * * @param contextName the name of the context. * @param regex the regular expression to match the node/URL. @@ -511,7 +527,8 @@ public void includeOneMatchingNodeInContext(String contextName, String regex) th } } if (!foundOneMatch) { - throw new Exception("Unexpected result: No url found in site tree matching regex " + regex); + throw new Exception( + "Unexpected result: No url found in site tree matching regex " + regex); } } @@ -519,10 +536,11 @@ private List getSessionUrls() throws Exception { List sessionUrls = new ArrayList<>(); ApiResponse response = core.urls(); if (response != null && response instanceof ApiResponseList) { - ApiResponseElement urlList = (ApiResponseElement) ((ApiResponseList) response).getItems().get(0); - for (ApiResponse element: ((ApiResponseList) response).getItems()){ - URL url = new URL(((ApiResponseElement)element).getValue()); - sessionUrls.add(url.getProtocol()+"://"+url.getHost()+url.getPath()); + ApiResponseElement urlList = + (ApiResponseElement) ((ApiResponseList) response).getItems().get(0); + for (ApiResponse element : ((ApiResponseList) response).getItems()) { + URL url = new URL(((ApiResponseElement) element).getValue()); + sessionUrls.add(url.getProtocol() + "://" + url.getHost() + url.getPath()); } System.out.println(urlList); } @@ -531,14 +549,14 @@ private List getSessionUrls() throws Exception { /** * Active scans the given site, that's in scope. - *

- * The method returns only after the scan has finished. - * + * + *

The method returns only after the scan has finished. + * * @param apikey the API key, might be {@code null}. * @param url the site to scan * @throws Exception if an error occurred while calling the API. - * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be set using one of - * the {@code ClientApi} constructors. + * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be + * set using one of the {@code ClientApi} constructors. */ @Deprecated public void activeScanSiteInScope(String apikey, String url) throws Exception { @@ -548,8 +566,8 @@ public void activeScanSiteInScope(String apikey, String url) throws Exception { /** * Active scans the given site, that's in scope. - *

- * The method returns only after the scan has finished. + * + *

The method returns only after the scan has finished. * * @param url the site to scan * @throws Exception if an error occurred while calling the API. @@ -563,12 +581,13 @@ public void activeScanSiteInScope(String url) throws Exception { private void waitForAScanToFinish(String targetUrl) throws ClientApiException { // Poll until spider finished int status = 0; - while ( status < 100) { + while (status < 100) { status = statusToInt(ascan.status("")); - if(debug){ + if (debug) { String format = "Scanning %s Progress: %d%%"; System.out.println(String.format(format, targetUrl, status)); - }try { + } + try { Thread.sleep(1000); } catch (InterruptedException e) { // Ignore @@ -577,13 +596,16 @@ private void waitForAScanToFinish(String targetUrl) throws ClientApiException { } /** - * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. - *

- * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not - * successful. The connection attempts might be polled in one second interval. + * Convenience method to wait for ZAP to be ready to receive API calls, when started + * programmatically. + * + *

It attempts to establish a connection to ZAP's proxy, in the given time, throwing an + * exception if the connection is not successful. The connection attempts might be polled in one + * second interval. * * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start - * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting + * @throws ClientApiException if the timeout was reached or if the thread was interrupted while + * waiting * @see #waitForSuccessfulConnectionToZap(int, int) */ public void waitForSuccessfulConnectionToZap(int timeoutInSeconds) throws ClientApiException { @@ -591,18 +613,22 @@ public void waitForSuccessfulConnectionToZap(int timeoutInSeconds) throws Client } /** - * Convenience method to wait for ZAP to be ready to receive API calls, when started programmatically. - *

- * It attempts to establish a connection to ZAP's proxy, in the given time, throwing an exception if the connection is not - * successful. The connection attempts are done with the given polling interval. + * Convenience method to wait for ZAP to be ready to receive API calls, when started + * programmatically. + * + *

It attempts to establish a connection to ZAP's proxy, in the given time, throwing an + * exception if the connection is not successful. The connection attempts are done with the + * given polling interval. * * @param timeoutInSeconds the (maximum) number of seconds to wait for ZAP to start * @param pollingIntervalInMs the interval, in milliseconds, for connection polling - * @throws ClientApiException if the timeout was reached or if the thread was interrupted while waiting. + * @throws ClientApiException if the timeout was reached or if the thread was interrupted while + * waiting. * @throws IllegalArgumentException if the interval for connection polling is negative. * @see #waitForSuccessfulConnectionToZap(int) */ - public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIntervalInMs) throws ClientApiException { + public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIntervalInMs) + throws ClientApiException { int timeoutInMs = (int) TimeUnit.SECONDS.toMillis(timeoutInSeconds); int connectionTimeoutInMs = timeoutInMs; boolean connectionSuccessful = false; @@ -610,7 +636,8 @@ public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIn do { try (Socket socket = new Socket()) { try { - socket.connect(new InetSocketAddress(zapAddress, zapPort), connectionTimeoutInMs); + socket.connect( + new InetSocketAddress(zapAddress, zapPort), connectionTimeoutInMs); connectionSuccessful = true; } catch (SocketTimeoutException ignore) { throw newTimeoutConnectionToZap(timeoutInSeconds); @@ -638,13 +665,14 @@ public void waitForSuccessfulConnectionToZap(int timeoutInSeconds, int pollingIn } private static ClientApiException newTimeoutConnectionToZap(int timeoutInSeconds) { - return new ClientApiException("Unable to connect to ZAP's proxy after " + timeoutInSeconds + " seconds."); + return new ClientApiException( + "Unable to connect to ZAP's proxy after " + timeoutInSeconds + " seconds."); } /** * A simple HTTP request. - *

- * Contains the request URI and headers. + * + *

Contains the request URI and headers. */ private static class HttpRequest { @@ -667,8 +695,8 @@ public URL getRequestUri() { /** * Adds a header with the given name and value. - *

- * If a header with the given name already exists it is replaced with the new value. + * + *

If a header with the given name already exists it is replaced with the new value. * * @param name the name of the header. * @param value the value of the header. @@ -678,8 +706,8 @@ public void addHeader(String name, String value) { } /** - * Gets the headers of the HTTP request. An unmodifiable {@code Map} containing the headers (the keys correspond to the - * header names and the values for its contents). + * Gets the headers of the HTTP request. An unmodifiable {@code Map} containing the headers + * (the keys correspond to the header names and the values for its contents). * * @return an unmodifiable {@code Map} containing the headers. */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java index ea129ca..ab49c27 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiException.java @@ -19,44 +19,42 @@ */ package org.zaproxy.clientapi.core; - public class ClientApiException extends Exception { - private static final long serialVersionUID = 1L; - - private final String code; - private final String detail; - - public ClientApiException(Exception e) { - super(e); - this.code = null; - this.detail = null; - } - - public ClientApiException(String s) { - super(s); - this.code = null; - this.detail = null; - } - - public ClientApiException(String message, Exception cause) { - super(message, cause); - this.code = null; - this.detail = null; - } - - public ClientApiException(String message, String code, String detail) { - super(message); - this.code = code; - this.detail = detail; - } - - public String getCode() { - return code; - } - - public String getDetail() { - return detail; - } - + private static final long serialVersionUID = 1L; + + private final String code; + private final String detail; + + public ClientApiException(Exception e) { + super(e); + this.code = null; + this.detail = null; + } + + public ClientApiException(String s) { + super(s); + this.code = null; + this.detail = null; + } + + public ClientApiException(String message, Exception cause) { + super(message, cause); + this.code = null; + this.detail = null; + } + + public ClientApiException(String message, String code, String detail) { + super(message); + this.code = code; + this.detail = detail; + } + + public String getCode() { + return code; + } + + public String getDetail() { + return detail; + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index 71a5e90..cd8df69 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -33,20 +33,28 @@ public class ClientApiMain { private ClientApi api; private boolean debug = false; - private enum Task{ - stop, showAlerts, checkAlerts, saveSession, newSession, activeScanUrl, activeScanSiteInScope, - addExcludeRegexToContext, addIncludeRegexToContext, addIncludeOneMatchingNodeToContext + private enum Task { + stop, + showAlerts, + checkAlerts, + saveSession, + newSession, + activeScanUrl, + activeScanSiteInScope, + addExcludeRegexToContext, + addIncludeRegexToContext, + addIncludeOneMatchingNodeToContext } - public static void main(String[] args){ + public static void main(String[] args) { new ClientApiMain(args); } - public ClientApiMain(String[] args){ + public ClientApiMain(String[] args) { initialize(args); try { executeTask(); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); showHelp(); } @@ -54,98 +62,102 @@ public ClientApiMain(String[] args){ private void executeTask() throws Exception { try { - switch(task){ + switch (task) { case stop: api.core.shutdown(); break; case checkAlerts: - if (params.get("alertsFile") == null){ + if (params.get("alertsFile") == null) { System.out.println("No Alerts File Path Supplied\n"); showHelp(); System.exit(1); } - File alertsFile = (File)params.get("alertsFile"); - if (!alertsFile.exists()){ - System.out.println("File not Found: "+alertsFile.getAbsolutePath()); + File alertsFile = (File) params.get("alertsFile"); + if (!alertsFile.exists()) { + System.out.println("File not Found: " + alertsFile.getAbsolutePath()); showHelp(); System.exit(1); } - if (params.get("outputFile") == null){ + if (params.get("outputFile") == null) { api.checkAlerts( AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), AlertsFile.getAlertsFromFile(alertsFile, "requireAlert")); - }else{ - File outFile = (File)params.get("outputFile"); + } else { + File outFile = (File) params.get("outputFile"); try { api.checkAlerts( AlertsFile.getAlertsFromFile(alertsFile, "ignoreAlert"), AlertsFile.getAlertsFromFile(alertsFile, "requireAlert"), outFile); - } catch (AssertionError e){ + } catch (AssertionError e) { System.out.println(e.getMessage()); System.exit(1); } } break; case showAlerts: - List alerts = api.getAlerts(null, -1, -1); - for (Alert alert : alerts) { + List alerts = api.getAlerts(null, -1, -1); + for (Alert alert : alerts) { System.out.println(alert.toString()); - } + } break; case saveSession: - if (params.get("sessionName") == null){ + if (params.get("sessionName") == null) { System.out.println("No session name supplied\n"); showHelp(); System.exit(1); } - api.core.saveSession((String)params.get("sessionName"), "true"); + api.core.saveSession((String) params.get("sessionName"), "true"); break; case newSession: - if (params.get("sessionName") == null){ + if (params.get("sessionName") == null) { api.core.newSession("", "true"); - }else{ - api.core.newSession((String)params.get("sessionName"), "true"); + } else { + api.core.newSession((String) params.get("sessionName"), "true"); } break; case activeScanUrl: - if (params.get("url") == null){ + if (params.get("url") == null) { System.out.println("No url supplied\n"); showHelp(); System.exit(1); - }else{ - api.ascan.scan((String)params.get("url"), "true", "false", "", "", ""); + } else { + api.ascan.scan((String) params.get("url"), "true", "false", "", "", ""); } break; case activeScanSiteInScope: checkForUrlParam(); - api.activeScanSiteInScope((String)params.get("url")); + api.activeScanSiteInScope((String) params.get("url")); break; case addExcludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.context.excludeFromContext((String)params.get("contextName"), (String)params.get("regex")); + api.context.excludeFromContext( + (String) params.get("contextName"), (String) params.get("regex")); break; case addIncludeRegexToContext: checkForContextNameParam(); checkForRegexParam(); - api.context.includeInContext((String)params.get("contextName"), (String)params.get("regex")); + api.context.includeInContext( + (String) params.get("contextName"), (String) params.get("regex")); break; case addIncludeOneMatchingNodeToContext: checkForContextNameParam(); checkForRegexParam(); - api.includeOneMatchingNodeInContext((String)params.get("contextName"), (String)params.get("regex")); + api.includeOneMatchingNodeInContext( + (String) params.get("contextName"), (String) params.get("regex")); break; } - } catch (ConnectException e){ - System.out.println(e.getMessage()+String.format(": zapaddr=%s, zapport=%d\n", zapaddr, zapport)); + } catch (ConnectException e) { + System.out.println( + e.getMessage() + String.format(": zapaddr=%s, zapport=%d\n", zapaddr, zapport)); showHelp(); System.exit(1); } } private void checkForRegexParam() { - if(params.get("regex") == null){ + if (params.get("regex") == null) { System.out.println("No regex supplied\n"); showHelp(); System.exit(1); @@ -153,7 +165,7 @@ private void checkForRegexParam() { } private void checkForContextNameParam() { - if (params.get("contextName") == null){ + if (params.get("contextName") == null) { System.out.println("No context name supplied\n"); showHelp(); System.exit(1); @@ -161,7 +173,7 @@ private void checkForContextNameParam() { } private void checkForUrlParam() { - if (params.get("url") == null){ + if (params.get("url") == null) { System.out.println("No url supplied\n"); showHelp(); System.exit(1); @@ -169,11 +181,11 @@ private void checkForUrlParam() { } private void initialize(String[] args) { - if (args.length > 0){ - if (args[0].equalsIgnoreCase("help")){ + if (args.length > 0) { + if (args[0].equalsIgnoreCase("help")) { try { setTask(args[1]); - }catch (IndexOutOfBoundsException e){ + } catch (IndexOutOfBoundsException e) { showHelp(); System.exit(1); } @@ -181,25 +193,26 @@ private void initialize(String[] args) { System.exit(0); } setTask(args[0]); - for (String arg: args){ + for (String arg : args) { String[] pair = arg.split("="); - if (pair.length == 2){ - if (pair[0].equalsIgnoreCase("zapaddr")){ + if (pair.length == 2) { + if (pair[0].equalsIgnoreCase("zapaddr")) { zapaddr = pair[1]; - } else if(pair[0].equalsIgnoreCase("zapport")){ + } else if (pair[0].equalsIgnoreCase("zapport")) { try { zapport = Integer.parseInt(pair[1]); - } catch (NumberFormatException e){ - System.out.println("Invalid value to zapport, must be in integer: "+pair[1]); + } catch (NumberFormatException e) { + System.out.println( + "Invalid value to zapport, must be in integer: " + pair[1]); showHelp(); System.exit(1); } - }else if(pair[0].equalsIgnoreCase("debug") && pair[1].equalsIgnoreCase("true")){ + } else if (pair[0].equalsIgnoreCase("debug") + && pair[1].equalsIgnoreCase("true")) { debug = true; - }else if(pair[0].contains("File")){ + } else if (pair[0].contains("File")) { params.put(pair[0], new File(pair[1])); - } - else{ + } else { params.put(pair[0], pair[1]); } } @@ -214,8 +227,8 @@ private void initialize(String[] args) { private void setTask(String arg) { try { task = Task.valueOf(arg); - } catch (IllegalArgumentException e){ - System.out.println("Unknown Task: "+arg); + } catch (IllegalArgumentException e) { + System.out.println("Unknown Task: " + arg); showHelp(); System.exit(1); } @@ -223,105 +236,115 @@ private void setTask(String arg) { private void showHelp() { String help = ""; - if (task == null){ - help = "usage: java -jar zap-api.jar [args]\n\n"+ - "Type 'java -jar zap-api.jar help ' for help on a specific subcommand.\n\n" + - "Available subcommands:\n"+ - "\tstop\n"+ - "\tcheckAlerts\n"+ - "\tshowAlerts\n"+ - "\tsaveSession\n"+ - "\tnewSession\n"; - } else{ - // TODO add case for activeScanSiteInScope - switch (task){ + if (task == null) { + help = + "usage: java -jar zap-api.jar [args]\n\n" + + "Type 'java -jar zap-api.jar help ' for help on a specific subcommand.\n\n" + + "Available subcommands:\n" + + "\tstop\n" + + "\tcheckAlerts\n" + + "\tshowAlerts\n" + + "\tsaveSession\n" + + "\tnewSession\n"; + } else { + // TODO add case for activeScanSiteInScope + switch (task) { case stop: - help = "usage: stop [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar stop' \n\t\t" + - "Stop zap listening on default settings (localhost:8090)\n\t" + - "2. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 apikey=1234' \n\t\t" + - "Stop zap listening on 192.168.1.1:8090\n\t" + - "3. Type 'java -jar zap-api.jar stop zapport=7080 apikey=1234' \n\t\t" + - "Stop zap listening on localhost:7080\n\t" + - "4. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 zapport=7080 apikey=1234' \n\t\t" + - "Stop zap listening on 192.168.1.1:7080\n\n"; + help = + "usage: stop [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar stop' \n\t\t" + + "Stop zap listening on default settings (localhost:8090)\n\t" + + "2. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 apikey=1234' \n\t\t" + + "Stop zap listening on 192.168.1.1:8090\n\t" + + "3. Type 'java -jar zap-api.jar stop zapport=7080 apikey=1234' \n\t\t" + + "Stop zap listening on localhost:7080\n\t" + + "4. Type 'java -jar zap-api.jar stop zapaddr=192.168.1.1 zapport=7080 apikey=1234' \n\t\t" + + "Stop zap listening on 192.168.1.1:7080\n\n"; break; case checkAlerts: - help = "usage: checkAlerts alertsFile={PATH} [outputFile={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples\n\t" + - "1. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\"' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile, using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on localhost:8090\n\t" + - "3. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on 192.168.1.1:7080\n" + - "Note: for paths containing spaces ensure path is enclosed in quotes\n\n"; + help = + "usage: checkAlerts alertsFile={PATH} [outputFile={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples\n\t" + + "1. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\"' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile, using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on localhost:8090\n\t" + + "3. Type 'java -jar zap-api.jar checkAlerts alertsFile=\"C:\\Users\\me\\My Documents\\alerts.xml\" outputFile=\"C:\\Users\\me\\My Documents\\report.xml\"' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Check alerts ignoring alerts from alertsFile, looking for required alerts from alertsFile. Outputting results to report.xml, using zap listening on 192.168.1.1:7080\n" + + "Note: for paths containing spaces ensure path is enclosed in quotes\n\n"; break; case showAlerts: - help = "usage: showAlerts [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar showAlerts' \n\t\t" + - "Show alerts, using zap listening on default settings (localhost:8090)\n\t" + - "2. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1' \n\t\t" + - "Show alerts, using zap listening on 192.168.1.1:8090\n\t" + - "3. Type 'java -jar zap-api.jar showAlerts zapport=7080' \n\t\t" + - "Show alerts, using zap listening on localhost:7080\n\t" + - "4. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Show alerts, using zap listening on 192.168.1.1:7080\n\n"; + help = + "usage: showAlerts [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar showAlerts' \n\t\t" + + "Show alerts, using zap listening on default settings (localhost:8090)\n\t" + + "2. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1' \n\t\t" + + "Show alerts, using zap listening on 192.168.1.1:8090\n\t" + + "3. Type 'java -jar zap-api.jar showAlerts zapport=7080' \n\t\t" + + "Show alerts, using zap listening on localhost:7080\n\t" + + "4. Type 'java -jar zap-api.jar showAlerts zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Show alerts, using zap listening on 192.168.1.1:7080\n\n"; break; case saveSession: - help = "usage: saveSession sessionName={PATH} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\"' \n\t\t" + - "Save zap session using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Save zap session using zap listening on 192.168.1.1:7080\nNote: for paths containing spaces ensure path is enclosed in quotes\n\n"; + help = + "usage: saveSession sessionName={PATH} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\"' \n\t\t" + + "Save zap session using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar saveSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Save zap session using zap listening on 192.168.1.1:7080\nNote: for paths containing spaces ensure path is enclosed in quotes\n\n"; break; case newSession: - help = "usage: newSession [sessionName={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar newSession' \n\t\t" + - "Start new session using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar newSession zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Start new session using zap listening on 192.168.1.1:7080\n\t" + - "3. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/newsession\"' \n\t\t" + - "Start new session using zap listening on localhost:8090, creating session files at /Users/me/My Documents/mysession/newsession\n\t" + - "4. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Start new session using zap listening on 192.168.1.1:7080, creating session files at /Users/me/My Documents/mysession/newsession\n" + - "Note: for paths containing spaces ensure path is enclosed in quotes"; + help = + "usage: newSession [sessionName={PATH}] [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar newSession' \n\t\t" + + "Start new session using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar newSession zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Start new session using zap listening on 192.168.1.1:7080\n\t" + + "3. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/newsession\"' \n\t\t" + + "Start new session using zap listening on localhost:8090, creating session files at /Users/me/My Documents/mysession/newsession\n\t" + + "4. Type 'java -jar zap-api.jar newSession sessionName=\"Users/me/My Documents/mysession/mysessionfile\" zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Start new session using zap listening on 192.168.1.1:7080, creating session files at /Users/me/My Documents/mysession/newsession\n" + + "Note: for paths containing spaces ensure path is enclosed in quotes"; break; case activeScanUrl: - help = "usage: activeScanUrl url={url} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' \n\t\t" + - "Execute and active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Execute and active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; + help = + "usage: activeScanUrl url={url} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' \n\t\t" + + "Execute and active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Execute and active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; break; case addExcludeRegexToContext: - help = "usage: addExcludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addExcludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "Urls that match the regex will be excluded from scope using context '1' using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addExcludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Urls that match the regex will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + help = + "usage: addExcludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addExcludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "Urls that match the regex will be excluded from scope using context '1' using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addExcludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Urls that match the regex will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; break; case addIncludeRegexToContext: - help = "usage: addIncludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addIncludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "Urls that match the regex will be included in scope using context '1' using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addIncludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "Urls that match the regex will be included in scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + help = + "usage: addIncludeRegexToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addIncludeRegexToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "Urls that match the regex will be included in scope using context '1' using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addIncludeRegexToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Urls that match the regex will be included in scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; break; case addIncludeOneMatchingNodeToContext: - help = "usage: addIncludeOneMatchingNodeToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + - "Examples:\n\t" + - "1. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + - "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using zap listening on localhost:8090\n\t" + - "2. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + - "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; + help = + "usage: addIncludeOneMatchingNodeToContext contextName={contextName} regex={regex} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext contextName=1 regex=\\Qhttp://example.com/area\\E.* \n\t\t" + + "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar addIncludeOneMatchingNodeToContext url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "The first url from the current session that matches the regex will be included in scope using context '1'. Any other matching url will be excluded from scope using context '1' using zap listening on 192.168.1.1:7080\n\t"; break; } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index 342ead8..e073333 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -25,52 +25,40 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Acsrf extends org.zaproxy.clientapi.gen.deprecated.AcsrfDeprecated { - private final ClientApi api; - - public Acsrf(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * Lists the names of all anti-CSRF tokens - */ - public ApiResponse optionTokensNames() throws ClientApiException { - return api.callApi("acsrf", "view", "optionTokensNames", null); - } + public Acsrf(ClientApi api) { + super(api); + this.api = api; + } - /** - * Adds an anti-CSRF token with the given name, enabled by default - */ - public ApiResponse addOptionToken(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("acsrf", "action", "addOptionToken", map); - } + /** Lists the names of all anti-CSRF tokens */ + public ApiResponse optionTokensNames() throws ClientApiException { + return api.callApi("acsrf", "view", "optionTokensNames", null); + } - /** - * Removes the anti-CSRF token with the given name - */ - public ApiResponse removeOptionToken(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("acsrf", "action", "removeOptionToken", map); - } + /** Adds an anti-CSRF token with the given name, enabled by default */ + public ApiResponse addOptionToken(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("acsrf", "action", "addOptionToken", map); + } - /** - * Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP - */ - public byte[] genForm(String hrefid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("hrefId", hrefid); - return api.callApiOther("acsrf", "other", "genForm", map); - } + /** Removes the anti-CSRF token with the given name */ + public ApiResponse removeOptionToken(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("acsrf", "action", "removeOptionToken", map); + } + /** Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ + public byte[] genForm(String hrefid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("hrefId", hrefid); + return api.callApiOther("acsrf", "other", "genForm", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 0aeaab0..3b3d647 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -25,260 +25,215 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class AjaxSpider extends org.zaproxy.clientapi.gen.deprecated.AjaxSpiderDeprecated { - private final ClientApi api; - - public AjaxSpider(ClientApi api) { - super(api); - this.api = api; - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse status() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "status", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse results(String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("ajaxSpider", "view", "results", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse numberOfResults() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "numberOfResults", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse fullResults() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "fullResults", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionBrowserId() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionBrowserId", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionEventWait() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionEventWait", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionMaxCrawlDepth() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionMaxCrawlDepth", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionMaxCrawlStates() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionMaxCrawlStates", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionMaxDuration() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionMaxDuration", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionNumberOfBrowsers() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionNumberOfBrowsers", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionReloadWait() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionReloadWait", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionClickDefaultElems() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionClickDefaultElems", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionClickElemsOnce() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionClickElemsOnce", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionRandomInputs() throws ClientApiException { - return api.callApi("ajaxSpider", "view", "optionRandomInputs", null); - } - - /** - * Runs the spider against the given URL and/or context, optionally, spidering everything in scope. The parameter 'contextName' can be used to constrain the scan to a Context, the option 'in scope' is ignored if a context was also specified. The parameter 'subtreeOnly' allows to restrict the spider under a site's subtree (using the specified 'url'). - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse scan(String url, String inscope, String contextname, String subtreeonly) throws ClientApiException { - Map map = new HashMap<>(); - if (url != null) { - map.put("url", url); - } - if (inscope != null) { - map.put("inScope", inscope); - } - if (contextname != null) { - map.put("contextName", contextname); - } - if (subtreeonly != null) { - map.put("subtreeOnly", subtreeonly); - } - return api.callApi("ajaxSpider", "action", "scan", map); - } - - /** - * Runs the spider from the perspective of a User, obtained using the given context name and user name. The parameter 'url' allows to specify the starting point for the spider, otherwise it's used an existing URL from the context (if any). The parameter 'subtreeOnly' allows to restrict the spider under a site's subtree (using the specified 'url'). - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse scanAsUser(String contextname, String username, String url, String subtreeonly) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("userName", username); - if (url != null) { - map.put("url", url); - } - if (subtreeonly != null) { - map.put("subtreeOnly", subtreeonly); - } - return api.callApi("ajaxSpider", "action", "scanAsUser", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse stop() throws ClientApiException { - return api.callApi("ajaxSpider", "action", "stop", null); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionBrowserId(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("ajaxSpider", "action", "setOptionBrowserId", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionClickDefaultElems(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ajaxSpider", "action", "setOptionClickDefaultElems", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionClickElemsOnce(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionEventWait(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionEventWait", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionMaxCrawlDepth(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlDepth", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionMaxCrawlStates(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlStates", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionMaxDuration", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionNumberOfBrowsers(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionNumberOfBrowsers", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionRandomInputs(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ajaxSpider", "action", "setOptionRandomInputs", map); - } - - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionReloadWait(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ajaxSpider", "action", "setOptionReloadWait", map); - } - + private final ClientApi api; + + public AjaxSpider(ClientApi api) { + super(api); + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse status() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "status", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse results(String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("ajaxSpider", "view", "results", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse numberOfResults() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "numberOfResults", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse fullResults() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "fullResults", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionBrowserId() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionBrowserId", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionEventWait() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionEventWait", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionMaxCrawlDepth() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionMaxCrawlDepth", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionMaxCrawlStates() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionMaxCrawlStates", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionMaxDuration() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionMaxDuration", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionNumberOfBrowsers() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionNumberOfBrowsers", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionReloadWait() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionReloadWait", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionClickDefaultElems() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionClickDefaultElems", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionClickElemsOnce() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionClickElemsOnce", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionRandomInputs() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionRandomInputs", null); + } + + /** + * Runs the spider against the given URL and/or context, optionally, spidering everything in + * scope. The parameter 'contextName' can be used to constrain the scan to a Context, the option + * 'in scope' is ignored if a context was also specified. The parameter 'subtreeOnly' allows to + * restrict the spider under a site's subtree (using the specified 'url'). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse scan(String url, String inscope, String contextname, String subtreeonly) + throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (inscope != null) { + map.put("inScope", inscope); + } + if (contextname != null) { + map.put("contextName", contextname); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("ajaxSpider", "action", "scan", map); + } + + /** + * Runs the spider from the perspective of a User, obtained using the given context name and + * user name. The parameter 'url' allows to specify the starting point for the spider, otherwise + * it's used an existing URL from the context (if any). The parameter 'subtreeOnly' allows to + * restrict the spider under a site's subtree (using the specified 'url'). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse scanAsUser( + String contextname, String username, String url, String subtreeonly) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("userName", username); + if (url != null) { + map.put("url", url); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("ajaxSpider", "action", "scanAsUser", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse stop() throws ClientApiException { + return api.callApi("ajaxSpider", "action", "stop", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionBrowserId(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("ajaxSpider", "action", "setOptionBrowserId", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionClickDefaultElems(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionClickDefaultElems", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionClickElemsOnce(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionEventWait(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionEventWait", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionMaxCrawlDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlDepth", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionMaxCrawlStates(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlStates", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionMaxDuration", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionNumberOfBrowsers(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionNumberOfBrowsers", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionRandomInputs(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionRandomInputs", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionReloadWait(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ajaxSpider", "action", "setOptionReloadWait", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 2aa50bb..29d4273 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -25,74 +25,80 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class AlertFilter { - private final ClientApi api; - - public AlertFilter(ClientApi api) { - this.api = api; - } + private final ClientApi api; - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse alertFilterList(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - if (contextid != null) { - map.put("contextId", contextid); - } - return api.callApi("alertFilter", "view", "alertFilterList", map); - } + public AlertFilter(ClientApi api) { + this.api = api; + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse addAlertFilter(String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("ruleId", ruleid); - map.put("newLevel", newlevel); - if (url != null) { - map.put("url", url); - } - if (urlisregex != null) { - map.put("urlIsRegex", urlisregex); - } - if (parameter != null) { - map.put("parameter", parameter); - } - if (enabled != null) { - map.put("enabled", enabled); - } - return api.callApi("alertFilter", "action", "addAlertFilter", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse alertFilterList(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + if (contextid != null) { + map.put("contextId", contextid); + } + return api.callApi("alertFilter", "view", "alertFilterList", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse removeAlertFilter(String contextid, String ruleid, String newlevel, String url, String urlisregex, String parameter, String enabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("ruleId", ruleid); - map.put("newLevel", newlevel); - if (url != null) { - map.put("url", url); - } - if (urlisregex != null) { - map.put("urlIsRegex", urlisregex); - } - if (parameter != null) { - map.put("parameter", parameter); - } - if (enabled != null) { - map.put("enabled", enabled); - } - return api.callApi("alertFilter", "action", "removeAlertFilter", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse addAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("alertFilter", "action", "addAlertFilter", map); + } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse removeAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("alertFilter", "action", "removeAlertFilter", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index cccbe35..a0e630c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -25,624 +25,666 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Ascan extends org.zaproxy.clientapi.gen.deprecated.AscanDeprecated { - private final ClientApi api; - - public Ascan(ClientApi api) { - super(api); - this.api = api; - } - - public ApiResponse status(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("ascan", "view", "status", map); - } - - public ApiResponse scanProgress(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("ascan", "view", "scanProgress", map); - } - - /** - * Gets the IDs of the messages sent during the scan with the given ID. A message can be obtained with 'message' core view. - */ - public ApiResponse messagesIds(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "view", "messagesIds", map); - } - - /** - * Gets the IDs of the alerts raised during the scan with the given ID. An alert can be obtained with 'alert' core view. - */ - public ApiResponse alertsIds(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "view", "alertsIds", map); - } - - public ApiResponse scans() throws ClientApiException { - return api.callApi("ascan", "view", "scans", null); - } - - public ApiResponse scanPolicyNames() throws ClientApiException { - return api.callApi("ascan", "view", "scanPolicyNames", null); - } - - /** - * Gets the regexes of URLs excluded from the active scans. - */ - public ApiResponse excludedFromScan() throws ClientApiException { - return api.callApi("ascan", "view", "excludedFromScan", null); - } - - public ApiResponse scanners(String scanpolicyname, String policyid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - if (policyid != null) { - map.put("policyId", policyid); - } - return api.callApi("ascan", "view", "scanners", map); - } - - public ApiResponse policies(String scanpolicyname, String policyid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - if (policyid != null) { - map.put("policyId", policyid); - } - return api.callApi("ascan", "view", "policies", map); - } - - public ApiResponse attackModeQueue() throws ClientApiException { - return api.callApi("ascan", "view", "attackModeQueue", null); - } - - /** - * Gets all the parameters that are excluded. For each parameter the following are shown: the name, the URL, and the parameter type. - */ - public ApiResponse excludedParams() throws ClientApiException { - return api.callApi("ascan", "view", "excludedParams", null); - } - - /** - * Use view excludedParams instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionExcludedParamList() throws ClientApiException { - return api.callApi("ascan", "view", "optionExcludedParamList", null); - } - - /** - * Gets all the types of excluded parameters. For each type the following are shown: the ID and the name. - */ - public ApiResponse excludedParamTypes() throws ClientApiException { - return api.callApi("ascan", "view", "excludedParamTypes", null); - } - - public ApiResponse optionAttackPolicy() throws ClientApiException { - return api.callApi("ascan", "view", "optionAttackPolicy", null); - } - - public ApiResponse optionDefaultPolicy() throws ClientApiException { - return api.callApi("ascan", "view", "optionDefaultPolicy", null); - } - - public ApiResponse optionDelayInMs() throws ClientApiException { - return api.callApi("ascan", "view", "optionDelayInMs", null); - } - - public ApiResponse optionHandleAntiCSRFTokens() throws ClientApiException { - return api.callApi("ascan", "view", "optionHandleAntiCSRFTokens", null); - } - - public ApiResponse optionHostPerScan() throws ClientApiException { - return api.callApi("ascan", "view", "optionHostPerScan", null); - } - - public ApiResponse optionMaxChartTimeInMins() throws ClientApiException { - return api.callApi("ascan", "view", "optionMaxChartTimeInMins", null); - } - - public ApiResponse optionMaxResultsToList() throws ClientApiException { - return api.callApi("ascan", "view", "optionMaxResultsToList", null); - } - - public ApiResponse optionMaxRuleDurationInMins() throws ClientApiException { - return api.callApi("ascan", "view", "optionMaxRuleDurationInMins", null); - } - - public ApiResponse optionMaxScanDurationInMins() throws ClientApiException { - return api.callApi("ascan", "view", "optionMaxScanDurationInMins", null); - } - - public ApiResponse optionMaxScansInUI() throws ClientApiException { - return api.callApi("ascan", "view", "optionMaxScansInUI", null); - } - - public ApiResponse optionTargetParamsEnabledRPC() throws ClientApiException { - return api.callApi("ascan", "view", "optionTargetParamsEnabledRPC", null); - } - - public ApiResponse optionTargetParamsInjectable() throws ClientApiException { - return api.callApi("ascan", "view", "optionTargetParamsInjectable", null); - } - - public ApiResponse optionThreadPerHost() throws ClientApiException { - return api.callApi("ascan", "view", "optionThreadPerHost", null); - } - - public ApiResponse optionAllowAttackOnStart() throws ClientApiException { - return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); - } - - /** - * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, with the ID of the scanner that's sending the requests. - */ - public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { - return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); - } - - public ApiResponse optionPromptInAttackMode() throws ClientApiException { - return api.callApi("ascan", "view", "optionPromptInAttackMode", null); - } - - public ApiResponse optionPromptToClearFinishedScans() throws ClientApiException { - return api.callApi("ascan", "view", "optionPromptToClearFinishedScans", null); - } - - public ApiResponse optionRescanInAttackMode() throws ClientApiException { - return api.callApi("ascan", "view", "optionRescanInAttackMode", null); - } - - /** - * Tells whether or not the HTTP Headers of all requests should be scanned. Not just requests that send parameters, through the query or request body. - */ - public ApiResponse optionScanHeadersAllRequests() throws ClientApiException { - return api.callApi("ascan", "view", "optionScanHeadersAllRequests", null); - } - - public ApiResponse optionShowAdvancedDialog() throws ClientApiException { - return api.callApi("ascan", "view", "optionShowAdvancedDialog", null); - } - - public ApiResponse scan(String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata) throws ClientApiException { - return scan(url, recurse, inscopeonly, scanpolicyname, method, postdata, (Integer) null); - } - - /** - * Runs the active scanner against the given URL and/or Context. Optionally, the 'recurse' parameter can be used to scan URLs under the given URL, the parameter 'inScopeOnly' can be used to constrain the scan to URLs that are in scope (ignored if a Context is specified), the parameter 'scanPolicyName' allows to specify the scan policy (if none is given it uses the default scan policy), the parameters 'method' and 'postData' allow to select a given request in conjunction with the given URL. - */ - public ApiResponse scan(String url, String recurse, String inscopeonly, String scanpolicyname, String method, String postdata, Integer contextid) throws ClientApiException { - Map map = new HashMap<>(); - if (url != null) { - map.put("url", url); - } - if (recurse != null) { - map.put("recurse", recurse); - } - if (inscopeonly != null) { - map.put("inScopeOnly", inscopeonly); - } - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - if (method != null) { - map.put("method", method); - } - if (postdata != null) { - map.put("postData", postdata); - } - if (contextid != null) { - map.put("contextId", contextid.toString()); - } - return api.callApi("ascan", "action", "scan", map); - } - - /** - * Active Scans from the perspective of a User, obtained using the given Context ID and User ID. See 'scan' action for more details. - */ - public ApiResponse scanAsUser(String url, String contextid, String userid, String recurse, String scanpolicyname, String method, String postdata) throws ClientApiException { - Map map = new HashMap<>(); - if (url != null) { - map.put("url", url); - } - if (contextid != null) { - map.put("contextId", contextid); - } - if (userid != null) { - map.put("userId", userid); - } - if (recurse != null) { - map.put("recurse", recurse); - } - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - if (method != null) { - map.put("method", method); - } - if (postdata != null) { - map.put("postData", postdata); - } - return api.callApi("ascan", "action", "scanAsUser", map); - } - - public ApiResponse pause(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "action", "pause", map); - } - - public ApiResponse resume(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "action", "resume", map); - } - - public ApiResponse stop(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "action", "stop", map); - } - - public ApiResponse removeScan(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("ascan", "action", "removeScan", map); - } - - public ApiResponse pauseAllScans() throws ClientApiException { - return api.callApi("ascan", "action", "pauseAllScans", null); - } - - public ApiResponse resumeAllScans() throws ClientApiException { - return api.callApi("ascan", "action", "resumeAllScans", null); - } - - public ApiResponse stopAllScans() throws ClientApiException { - return api.callApi("ascan", "action", "stopAllScans", null); - } - - public ApiResponse removeAllScans() throws ClientApiException { - return api.callApi("ascan", "action", "removeAllScans", null); - } - - /** - * Clears the regexes of URLs excluded from the active scans. - */ - public ApiResponse clearExcludedFromScan() throws ClientApiException { - return api.callApi("ascan", "action", "clearExcludedFromScan", null); - } - - /** - * Adds a regex of URLs that should be excluded from the active scans. - */ - public ApiResponse excludeFromScan(String regex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - return api.callApi("ascan", "action", "excludeFromScan", map); - } - - public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "enableAllScanners", map); - } - - public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "disableAllScanners", map); - } - - public ApiResponse enableScanners(String ids, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "enableScanners", map); - } - - public ApiResponse disableScanners(String ids, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "disableScanners", map); - } - - public ApiResponse setEnabledPolicies(String ids, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "setEnabledPolicies", map); - } - - public ApiResponse setPolicyAttackStrength(String id, String attackstrength, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("attackStrength", attackstrength); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "setPolicyAttackStrength", map); - } - - public ApiResponse setPolicyAlertThreshold(String id, String alertthreshold, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("alertThreshold", alertthreshold); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "setPolicyAlertThreshold", map); - } - - public ApiResponse setScannerAttackStrength(String id, String attackstrength, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("attackStrength", attackstrength); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "setScannerAttackStrength", map); - } - - public ApiResponse setScannerAlertThreshold(String id, String alertthreshold, String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("alertThreshold", alertthreshold); - if (scanpolicyname != null) { - map.put("scanPolicyName", scanpolicyname); - } - return api.callApi("ascan", "action", "setScannerAlertThreshold", map); - } - - public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { - return addScanPolicy(scanpolicyname, null, null); - } - - public ApiResponse addScanPolicy(String scanpolicyname, String alertthreshold, String attackstrength) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanPolicyName", scanpolicyname); - if (alertthreshold != null) { - map.put("alertThreshold", alertthreshold); - } - if (attackstrength != null) { - map.put("attackStrength", attackstrength); - } - return api.callApi("ascan", "action", "addScanPolicy", map); - } - - public ApiResponse removeScanPolicy(String scanpolicyname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanPolicyName", scanpolicyname); - return api.callApi("ascan", "action", "removeScanPolicy", map); - } - - public ApiResponse updateScanPolicy(String scanpolicyname, String alertthreshold, String attackstrength) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanPolicyName", scanpolicyname); - if (alertthreshold != null) { - map.put("alertThreshold", alertthreshold); - } - if (attackstrength != null) { - map.put("attackStrength", attackstrength); - } - return api.callApi("ascan", "action", "updateScanPolicy", map); - } - - /** - * Imports a Scan Policy using the given file system path. - */ - public ApiResponse importScanPolicy(String path) throws ClientApiException { - Map map = new HashMap<>(); - map.put("path", path); - return api.callApi("ascan", "action", "importScanPolicy", map); - } - - /** - * Adds a new parameter excluded from the scan, using the specified name. Optionally sets if the new entry applies to a specific URL (default, all URLs) and sets the ID of the type of the parameter (default, ID of any type). The type IDs can be obtained with the view excludedParamTypes. - */ - public ApiResponse addExcludedParam(String name, String type, String url) throws ClientApiException { - Map map = new HashMap<>(); - map.put("name", name); - if (type != null) { - map.put("type", type); - } - if (url != null) { - map.put("url", url); - } - return api.callApi("ascan", "action", "addExcludedParam", map); - } - - /** - * Modifies a parameter excluded from the scan. Allows to modify the name, the URL and the type of parameter. The parameter is selected with its index, which can be obtained with the view excludedParams. - */ - public ApiResponse modifyExcludedParam(String idx, String name, String type, String url) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - if (name != null) { - map.put("name", name); - } - if (type != null) { - map.put("type", type); - } - if (url != null) { - map.put("url", url); - } - return api.callApi("ascan", "action", "modifyExcludedParam", map); - } - - /** - * Removes a parameter excluded from the scan, with the given index. The index can be obtained with the view excludedParams. - */ - public ApiResponse removeExcludedParam(String idx) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - return api.callApi("ascan", "action", "removeExcludedParam", map); - } - - /** - * Skips the scanner using the given IDs of the scan and the scanner. - */ - public ApiResponse skipScanner(String scanid, String scannerid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - map.put("scannerId", scannerid); - return api.callApi("ascan", "action", "skipScanner", map); - } - - public ApiResponse setOptionAttackPolicy(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("ascan", "action", "setOptionAttackPolicy", map); - } - - public ApiResponse setOptionDefaultPolicy(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("ascan", "action", "setOptionDefaultPolicy", map); - } - - public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); - } - - public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionDelayInMs", map); - } - - public ApiResponse setOptionHandleAntiCSRFTokens(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionHandleAntiCSRFTokens", map); - } - - public ApiResponse setOptionHostPerScan(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionHostPerScan", map); - } - - /** - * Sets whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, with the ID of the scanner that's sending the requests. - */ - public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionInjectPluginIdInHeader", map); - } - - public ApiResponse setOptionMaxChartTimeInMins(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionMaxChartTimeInMins", map); - } - - public ApiResponse setOptionMaxResultsToList(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionMaxResultsToList", map); - } - - public ApiResponse setOptionMaxRuleDurationInMins(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionMaxRuleDurationInMins", map); - } - - public ApiResponse setOptionMaxScanDurationInMins(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionMaxScanDurationInMins", map); - } - - public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionMaxScansInUI", map); - } - - public ApiResponse setOptionPromptInAttackMode(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionPromptInAttackMode", map); - } - - public ApiResponse setOptionPromptToClearFinishedScans(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionPromptToClearFinishedScans", map); - } - - public ApiResponse setOptionRescanInAttackMode(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionRescanInAttackMode", map); - } - - /** - * Sets whether or not the HTTP Headers of all requests should be scanned. Not just requests that send parameters, through the query or request body. - */ - public ApiResponse setOptionScanHeadersAllRequests(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionScanHeadersAllRequests", map); - } - - public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("ascan", "action", "setOptionShowAdvancedDialog", map); - } - - public ApiResponse setOptionTargetParamsEnabledRPC(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionTargetParamsEnabledRPC", map); - } - - public ApiResponse setOptionTargetParamsInjectable(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionTargetParamsInjectable", map); - } - - public ApiResponse setOptionThreadPerHost(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("ascan", "action", "setOptionThreadPerHost", map); - } - + private final ClientApi api; + + public Ascan(ClientApi api) { + super(api); + this.api = api; + } + + public ApiResponse status(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("ascan", "view", "status", map); + } + + public ApiResponse scanProgress(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("ascan", "view", "scanProgress", map); + } + + /** + * Gets the IDs of the messages sent during the scan with the given ID. A message can be + * obtained with 'message' core view. + */ + public ApiResponse messagesIds(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "view", "messagesIds", map); + } + + /** + * Gets the IDs of the alerts raised during the scan with the given ID. An alert can be obtained + * with 'alert' core view. + */ + public ApiResponse alertsIds(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "view", "alertsIds", map); + } + + public ApiResponse scans() throws ClientApiException { + return api.callApi("ascan", "view", "scans", null); + } + + public ApiResponse scanPolicyNames() throws ClientApiException { + return api.callApi("ascan", "view", "scanPolicyNames", null); + } + + /** Gets the regexes of URLs excluded from the active scans. */ + public ApiResponse excludedFromScan() throws ClientApiException { + return api.callApi("ascan", "view", "excludedFromScan", null); + } + + public ApiResponse scanners(String scanpolicyname, String policyid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (policyid != null) { + map.put("policyId", policyid); + } + return api.callApi("ascan", "view", "scanners", map); + } + + public ApiResponse policies(String scanpolicyname, String policyid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (policyid != null) { + map.put("policyId", policyid); + } + return api.callApi("ascan", "view", "policies", map); + } + + public ApiResponse attackModeQueue() throws ClientApiException { + return api.callApi("ascan", "view", "attackModeQueue", null); + } + + /** + * Gets all the parameters that are excluded. For each parameter the following are shown: the + * name, the URL, and the parameter type. + */ + public ApiResponse excludedParams() throws ClientApiException { + return api.callApi("ascan", "view", "excludedParams", null); + } + + /** + * Use view excludedParams instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionExcludedParamList() throws ClientApiException { + return api.callApi("ascan", "view", "optionExcludedParamList", null); + } + + /** + * Gets all the types of excluded parameters. For each type the following are shown: the ID and + * the name. + */ + public ApiResponse excludedParamTypes() throws ClientApiException { + return api.callApi("ascan", "view", "excludedParamTypes", null); + } + + public ApiResponse optionAttackPolicy() throws ClientApiException { + return api.callApi("ascan", "view", "optionAttackPolicy", null); + } + + public ApiResponse optionDefaultPolicy() throws ClientApiException { + return api.callApi("ascan", "view", "optionDefaultPolicy", null); + } + + public ApiResponse optionDelayInMs() throws ClientApiException { + return api.callApi("ascan", "view", "optionDelayInMs", null); + } + + public ApiResponse optionHandleAntiCSRFTokens() throws ClientApiException { + return api.callApi("ascan", "view", "optionHandleAntiCSRFTokens", null); + } + + public ApiResponse optionHostPerScan() throws ClientApiException { + return api.callApi("ascan", "view", "optionHostPerScan", null); + } + + public ApiResponse optionMaxChartTimeInMins() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxChartTimeInMins", null); + } + + public ApiResponse optionMaxResultsToList() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxResultsToList", null); + } + + public ApiResponse optionMaxRuleDurationInMins() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxRuleDurationInMins", null); + } + + public ApiResponse optionMaxScanDurationInMins() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxScanDurationInMins", null); + } + + public ApiResponse optionMaxScansInUI() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxScansInUI", null); + } + + public ApiResponse optionTargetParamsEnabledRPC() throws ClientApiException { + return api.callApi("ascan", "view", "optionTargetParamsEnabledRPC", null); + } + + public ApiResponse optionTargetParamsInjectable() throws ClientApiException { + return api.callApi("ascan", "view", "optionTargetParamsInjectable", null); + } + + public ApiResponse optionThreadPerHost() throws ClientApiException { + return api.callApi("ascan", "view", "optionThreadPerHost", null); + } + + public ApiResponse optionAllowAttackOnStart() throws ClientApiException { + return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); + } + + /** + * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, + * with the ID of the scanner that's sending the requests. + */ + public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { + return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); + } + + public ApiResponse optionPromptInAttackMode() throws ClientApiException { + return api.callApi("ascan", "view", "optionPromptInAttackMode", null); + } + + public ApiResponse optionPromptToClearFinishedScans() throws ClientApiException { + return api.callApi("ascan", "view", "optionPromptToClearFinishedScans", null); + } + + public ApiResponse optionRescanInAttackMode() throws ClientApiException { + return api.callApi("ascan", "view", "optionRescanInAttackMode", null); + } + + /** + * Tells whether or not the HTTP Headers of all requests should be scanned. Not just requests + * that send parameters, through the query or request body. + */ + public ApiResponse optionScanHeadersAllRequests() throws ClientApiException { + return api.callApi("ascan", "view", "optionScanHeadersAllRequests", null); + } + + public ApiResponse optionShowAdvancedDialog() throws ClientApiException { + return api.callApi("ascan", "view", "optionShowAdvancedDialog", null); + } + + public ApiResponse scan( + String url, + String recurse, + String inscopeonly, + String scanpolicyname, + String method, + String postdata) + throws ClientApiException { + return scan(url, recurse, inscopeonly, scanpolicyname, method, postdata, (Integer) null); + } + + /** + * Runs the active scanner against the given URL and/or Context. Optionally, the 'recurse' + * parameter can be used to scan URLs under the given URL, the parameter 'inScopeOnly' can be + * used to constrain the scan to URLs that are in scope (ignored if a Context is specified), the + * parameter 'scanPolicyName' allows to specify the scan policy (if none is given it uses the + * default scan policy), the parameters 'method' and 'postData' allow to select a given request + * in conjunction with the given URL. + */ + public ApiResponse scan( + String url, + String recurse, + String inscopeonly, + String scanpolicyname, + String method, + String postdata, + Integer contextid) + throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (inscopeonly != null) { + map.put("inScopeOnly", inscopeonly); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + if (contextid != null) { + map.put("contextId", contextid.toString()); + } + return api.callApi("ascan", "action", "scan", map); + } + + /** + * Active Scans from the perspective of a User, obtained using the given Context ID and User ID. + * See 'scan' action for more details. + */ + public ApiResponse scanAsUser( + String url, + String contextid, + String userid, + String recurse, + String scanpolicyname, + String method, + String postdata) + throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (contextid != null) { + map.put("contextId", contextid); + } + if (userid != null) { + map.put("userId", userid); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + return api.callApi("ascan", "action", "scanAsUser", map); + } + + public ApiResponse pause(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "action", "pause", map); + } + + public ApiResponse resume(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "action", "resume", map); + } + + public ApiResponse stop(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "action", "stop", map); + } + + public ApiResponse removeScan(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("ascan", "action", "removeScan", map); + } + + public ApiResponse pauseAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "pauseAllScans", null); + } + + public ApiResponse resumeAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "resumeAllScans", null); + } + + public ApiResponse stopAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "stopAllScans", null); + } + + public ApiResponse removeAllScans() throws ClientApiException { + return api.callApi("ascan", "action", "removeAllScans", null); + } + + /** Clears the regexes of URLs excluded from the active scans. */ + public ApiResponse clearExcludedFromScan() throws ClientApiException { + return api.callApi("ascan", "action", "clearExcludedFromScan", null); + } + + /** Adds a regex of URLs that should be excluded from the active scans. */ + public ApiResponse excludeFromScan(String regex) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + return api.callApi("ascan", "action", "excludeFromScan", map); + } + + public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "enableAllScanners", map); + } + + public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "disableAllScanners", map); + } + + public ApiResponse enableScanners(String ids, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "enableScanners", map); + } + + public ApiResponse disableScanners(String ids, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "disableScanners", map); + } + + public ApiResponse setEnabledPolicies(String ids, String scanpolicyname) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setEnabledPolicies", map); + } + + public ApiResponse setPolicyAttackStrength( + String id, String attackstrength, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("attackStrength", attackstrength); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setPolicyAttackStrength", map); + } + + public ApiResponse setPolicyAlertThreshold( + String id, String alertthreshold, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("alertThreshold", alertthreshold); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setPolicyAlertThreshold", map); + } + + public ApiResponse setScannerAttackStrength( + String id, String attackstrength, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("attackStrength", attackstrength); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setScannerAttackStrength", map); + } + + public ApiResponse setScannerAlertThreshold( + String id, String alertthreshold, String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("alertThreshold", alertthreshold); + if (scanpolicyname != null) { + map.put("scanPolicyName", scanpolicyname); + } + return api.callApi("ascan", "action", "setScannerAlertThreshold", map); + } + + public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { + return addScanPolicy(scanpolicyname, null, null); + } + + public ApiResponse addScanPolicy( + String scanpolicyname, String alertthreshold, String attackstrength) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanPolicyName", scanpolicyname); + if (alertthreshold != null) { + map.put("alertThreshold", alertthreshold); + } + if (attackstrength != null) { + map.put("attackStrength", attackstrength); + } + return api.callApi("ascan", "action", "addScanPolicy", map); + } + + public ApiResponse removeScanPolicy(String scanpolicyname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanPolicyName", scanpolicyname); + return api.callApi("ascan", "action", "removeScanPolicy", map); + } + + public ApiResponse updateScanPolicy( + String scanpolicyname, String alertthreshold, String attackstrength) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanPolicyName", scanpolicyname); + if (alertthreshold != null) { + map.put("alertThreshold", alertthreshold); + } + if (attackstrength != null) { + map.put("attackStrength", attackstrength); + } + return api.callApi("ascan", "action", "updateScanPolicy", map); + } + + /** Imports a Scan Policy using the given file system path. */ + public ApiResponse importScanPolicy(String path) throws ClientApiException { + Map map = new HashMap<>(); + map.put("path", path); + return api.callApi("ascan", "action", "importScanPolicy", map); + } + + /** + * Adds a new parameter excluded from the scan, using the specified name. Optionally sets if the + * new entry applies to a specific URL (default, all URLs) and sets the ID of the type of the + * parameter (default, ID of any type). The type IDs can be obtained with the view + * excludedParamTypes. + */ + public ApiResponse addExcludedParam(String name, String type, String url) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + if (type != null) { + map.put("type", type); + } + if (url != null) { + map.put("url", url); + } + return api.callApi("ascan", "action", "addExcludedParam", map); + } + + /** + * Modifies a parameter excluded from the scan. Allows to modify the name, the URL and the type + * of parameter. The parameter is selected with its index, which can be obtained with the view + * excludedParams. + */ + public ApiResponse modifyExcludedParam(String idx, String name, String type, String url) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (name != null) { + map.put("name", name); + } + if (type != null) { + map.put("type", type); + } + if (url != null) { + map.put("url", url); + } + return api.callApi("ascan", "action", "modifyExcludedParam", map); + } + + /** + * Removes a parameter excluded from the scan, with the given index. The index can be obtained + * with the view excludedParams. + */ + public ApiResponse removeExcludedParam(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("ascan", "action", "removeExcludedParam", map); + } + + /** Skips the scanner using the given IDs of the scan and the scanner. */ + public ApiResponse skipScanner(String scanid, String scannerid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + map.put("scannerId", scannerid); + return api.callApi("ascan", "action", "skipScanner", map); + } + + public ApiResponse setOptionAttackPolicy(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("ascan", "action", "setOptionAttackPolicy", map); + } + + public ApiResponse setOptionDefaultPolicy(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("ascan", "action", "setOptionDefaultPolicy", map); + } + + public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); + } + + public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionDelayInMs", map); + } + + public ApiResponse setOptionHandleAntiCSRFTokens(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionHandleAntiCSRFTokens", map); + } + + public ApiResponse setOptionHostPerScan(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionHostPerScan", map); + } + + /** + * Sets whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, + * with the ID of the scanner that's sending the requests. + */ + public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionInjectPluginIdInHeader", map); + } + + public ApiResponse setOptionMaxChartTimeInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxChartTimeInMins", map); + } + + public ApiResponse setOptionMaxResultsToList(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxResultsToList", map); + } + + public ApiResponse setOptionMaxRuleDurationInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxRuleDurationInMins", map); + } + + public ApiResponse setOptionMaxScanDurationInMins(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxScanDurationInMins", map); + } + + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxScansInUI", map); + } + + public ApiResponse setOptionPromptInAttackMode(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionPromptInAttackMode", map); + } + + public ApiResponse setOptionPromptToClearFinishedScans(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionPromptToClearFinishedScans", map); + } + + public ApiResponse setOptionRescanInAttackMode(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionRescanInAttackMode", map); + } + + /** + * Sets whether or not the HTTP Headers of all requests should be scanned. Not just requests + * that send parameters, through the query or request body. + */ + public ApiResponse setOptionScanHeadersAllRequests(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionScanHeadersAllRequests", map); + } + + public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionShowAdvancedDialog", map); + } + + public ApiResponse setOptionTargetParamsEnabledRPC(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionTargetParamsEnabledRPC", map); + } + + public ApiResponse setOptionTargetParamsInjectable(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionTargetParamsInjectable", map); + } + + public ApiResponse setOptionThreadPerHost(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionThreadPerHost", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java index 158d8c4..4b9373d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java @@ -25,70 +25,71 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Authentication extends org.zaproxy.clientapi.gen.deprecated.AuthenticationDeprecated { - private final ClientApi api; - - public Authentication(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - public ApiResponse getSupportedAuthenticationMethods() throws ClientApiException { - return api.callApi("authentication", "view", "getSupportedAuthenticationMethods", null); - } + public Authentication(ClientApi api) { + super(api); + this.api = api; + } - public ApiResponse getAuthenticationMethodConfigParams(String authmethodname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("authMethodName", authmethodname); - return api.callApi("authentication", "view", "getAuthenticationMethodConfigParams", map); - } + public ApiResponse getSupportedAuthenticationMethods() throws ClientApiException { + return api.callApi("authentication", "view", "getSupportedAuthenticationMethods", null); + } - public ApiResponse getAuthenticationMethod(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("authentication", "view", "getAuthenticationMethod", map); - } + public ApiResponse getAuthenticationMethodConfigParams(String authmethodname) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("authMethodName", authmethodname); + return api.callApi("authentication", "view", "getAuthenticationMethodConfigParams", map); + } - public ApiResponse getLoggedInIndicator(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("authentication", "view", "getLoggedInIndicator", map); - } + public ApiResponse getAuthenticationMethod(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("authentication", "view", "getAuthenticationMethod", map); + } - public ApiResponse getLoggedOutIndicator(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("authentication", "view", "getLoggedOutIndicator", map); - } + public ApiResponse getLoggedInIndicator(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("authentication", "view", "getLoggedInIndicator", map); + } - public ApiResponse setAuthenticationMethod(String contextid, String authmethodname, String authmethodconfigparams) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("authMethodName", authmethodname); - if (authmethodconfigparams != null) { - map.put("authMethodConfigParams", authmethodconfigparams); - } - return api.callApi("authentication", "action", "setAuthenticationMethod", map); - } + public ApiResponse getLoggedOutIndicator(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("authentication", "view", "getLoggedOutIndicator", map); + } - public ApiResponse setLoggedInIndicator(String contextid, String loggedinindicatorregex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("loggedInIndicatorRegex", loggedinindicatorregex); - return api.callApi("authentication", "action", "setLoggedInIndicator", map); - } + public ApiResponse setAuthenticationMethod( + String contextid, String authmethodname, String authmethodconfigparams) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("authMethodName", authmethodname); + if (authmethodconfigparams != null) { + map.put("authMethodConfigParams", authmethodconfigparams); + } + return api.callApi("authentication", "action", "setAuthenticationMethod", map); + } - public ApiResponse setLoggedOutIndicator(String contextid, String loggedoutindicatorregex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("loggedOutIndicatorRegex", loggedoutindicatorregex); - return api.callApi("authentication", "action", "setLoggedOutIndicator", map); - } + public ApiResponse setLoggedInIndicator(String contextid, String loggedinindicatorregex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("loggedInIndicatorRegex", loggedinindicatorregex); + return api.callApi("authentication", "action", "setLoggedInIndicator", map); + } + public ApiResponse setLoggedOutIndicator(String contextid, String loggedoutindicatorregex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("loggedOutIndicatorRegex", loggedoutindicatorregex); + return api.callApi("authentication", "action", "setLoggedOutIndicator", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java index 243eca8..87fee7b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authorization.java @@ -25,48 +25,54 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Authorization extends org.zaproxy.clientapi.gen.deprecated.AuthorizationDeprecated { - private final ClientApi api; - - public Authorization(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * Obtains all the configuration of the authorization detection method that is currently set for a context. - */ - public ApiResponse getAuthorizationDetectionMethod(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("authorization", "view", "getAuthorizationDetectionMethod", map); - } + public Authorization(ClientApi api) { + super(api); + this.api = api; + } - /** - * Sets the authorization detection method for a context as one that identifies un-authorized messages based on: the message's status code or a regex pattern in the response's header or body. Also, whether all conditions must match or just some can be specified via the logicalOperator parameter, which accepts two values: "AND" (default), "OR". - */ - public ApiResponse setBasicAuthorizationDetectionMethod(String contextid, String headerregex, String bodyregex, String statuscode, String logicaloperator) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - if (headerregex != null) { - map.put("headerRegex", headerregex); - } - if (bodyregex != null) { - map.put("bodyRegex", bodyregex); - } - if (statuscode != null) { - map.put("statusCode", statuscode); - } - if (logicaloperator != null) { - map.put("logicalOperator", logicaloperator); - } - return api.callApi("authorization", "action", "setBasicAuthorizationDetectionMethod", map); - } + /** + * Obtains all the configuration of the authorization detection method that is currently set for + * a context. + */ + public ApiResponse getAuthorizationDetectionMethod(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("authorization", "view", "getAuthorizationDetectionMethod", map); + } + /** + * Sets the authorization detection method for a context as one that identifies un-authorized + * messages based on: the message's status code or a regex pattern in the response's header or + * body. Also, whether all conditions must match or just some can be specified via the + * logicalOperator parameter, which accepts two values: "AND" (default), "OR". + */ + public ApiResponse setBasicAuthorizationDetectionMethod( + String contextid, + String headerregex, + String bodyregex, + String statuscode, + String logicaloperator) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + if (headerregex != null) { + map.put("headerRegex", headerregex); + } + if (bodyregex != null) { + map.put("bodyRegex", bodyregex); + } + if (statuscode != null) { + map.put("statusCode", statuscode); + } + if (logicaloperator != null) { + map.put("logicalOperator", logicaloperator); + } + return api.callApi("authorization", "action", "setBasicAuthorizationDetectionMethod", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index 59c69b8..cced27b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -25,185 +25,172 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Autoupdate extends org.zaproxy.clientapi.gen.deprecated.AutoupdateDeprecated { - private final ClientApi api; - - public Autoupdate(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Returns the latest version number - */ - public ApiResponse latestVersionNumber() throws ClientApiException { - return api.callApi("autoupdate", "view", "latestVersionNumber", null); - } - - /** - * Returns 'true' if ZAP is on the latest version - */ - public ApiResponse isLatestVersion() throws ClientApiException { - return api.callApi("autoupdate", "view", "isLatestVersion", null); - } - - /** - * Return a list of all of the installed add-ons - */ - public ApiResponse installedAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "installedAddons", null); - } - - /** - * Return a list of any add-ons that have been added to the Marketplace since the last check for updates - */ - public ApiResponse newAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "newAddons", null); - } - - /** - * Return a list of any add-ons that have been changed in the Marketplace since the last check for updates - */ - public ApiResponse updatedAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "updatedAddons", null); - } - - /** - * Return a list of all of the add-ons on the ZAP Marketplace (this information is read once and then cached) - */ - public ApiResponse marketplaceAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "marketplaceAddons", null); - } - - public ApiResponse optionAddonDirectories() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionAddonDirectories", null); - } - - public ApiResponse optionDayLastChecked() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionDayLastChecked", null); - } - - public ApiResponse optionDayLastInstallWarned() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionDayLastInstallWarned", null); - } - - public ApiResponse optionDayLastUpdateWarned() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionDayLastUpdateWarned", null); - } - - public ApiResponse optionDownloadDirectory() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionDownloadDirectory", null); - } - - public ApiResponse optionCheckAddonUpdates() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionCheckAddonUpdates", null); - } - - public ApiResponse optionCheckOnStart() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionCheckOnStart", null); - } - - public ApiResponse optionDownloadNewRelease() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionDownloadNewRelease", null); - } - - public ApiResponse optionInstallAddonUpdates() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionInstallAddonUpdates", null); - } - - public ApiResponse optionInstallScannerRules() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionInstallScannerRules", null); - } - - public ApiResponse optionReportAlphaAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionReportAlphaAddons", null); - } - - public ApiResponse optionReportBetaAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionReportBetaAddons", null); - } - - public ApiResponse optionReportReleaseAddons() throws ClientApiException { - return api.callApi("autoupdate", "view", "optionReportReleaseAddons", null); - } - - /** - * Downloads the latest release, if any - */ - public ApiResponse downloadLatestRelease() throws ClientApiException { - return api.callApi("autoupdate", "action", "downloadLatestRelease", null); - } - - /** - * Installs or updates the specified add-on, returning when complete (ie not asynchronously) - */ - public ApiResponse installAddon(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("autoupdate", "action", "installAddon", map); - } - - /** - * Uninstalls the specified add-on - */ - public ApiResponse uninstallAddon(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("autoupdate", "action", "uninstallAddon", map); - } - - public ApiResponse setOptionCheckAddonUpdates(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionCheckAddonUpdates", map); - } - - public ApiResponse setOptionCheckOnStart(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionCheckOnStart", map); - } - - public ApiResponse setOptionDownloadNewRelease(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionDownloadNewRelease", map); - } - - public ApiResponse setOptionInstallAddonUpdates(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionInstallAddonUpdates", map); - } - - public ApiResponse setOptionInstallScannerRules(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionInstallScannerRules", map); - } - - public ApiResponse setOptionReportAlphaAddons(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionReportAlphaAddons", map); - } - - public ApiResponse setOptionReportBetaAddons(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionReportBetaAddons", map); - } - - public ApiResponse setOptionReportReleaseAddons(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("autoupdate", "action", "setOptionReportReleaseAddons", map); - } - + private final ClientApi api; + + public Autoupdate(ClientApi api) { + super(api); + this.api = api; + } + + /** Returns the latest version number */ + public ApiResponse latestVersionNumber() throws ClientApiException { + return api.callApi("autoupdate", "view", "latestVersionNumber", null); + } + + /** Returns 'true' if ZAP is on the latest version */ + public ApiResponse isLatestVersion() throws ClientApiException { + return api.callApi("autoupdate", "view", "isLatestVersion", null); + } + + /** Return a list of all of the installed add-ons */ + public ApiResponse installedAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "installedAddons", null); + } + + /** + * Return a list of any add-ons that have been added to the Marketplace since the last check for + * updates + */ + public ApiResponse newAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "newAddons", null); + } + + /** + * Return a list of any add-ons that have been changed in the Marketplace since the last check + * for updates + */ + public ApiResponse updatedAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "updatedAddons", null); + } + + /** + * Return a list of all of the add-ons on the ZAP Marketplace (this information is read once and + * then cached) + */ + public ApiResponse marketplaceAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "marketplaceAddons", null); + } + + public ApiResponse optionAddonDirectories() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionAddonDirectories", null); + } + + public ApiResponse optionDayLastChecked() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionDayLastChecked", null); + } + + public ApiResponse optionDayLastInstallWarned() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionDayLastInstallWarned", null); + } + + public ApiResponse optionDayLastUpdateWarned() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionDayLastUpdateWarned", null); + } + + public ApiResponse optionDownloadDirectory() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionDownloadDirectory", null); + } + + public ApiResponse optionCheckAddonUpdates() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionCheckAddonUpdates", null); + } + + public ApiResponse optionCheckOnStart() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionCheckOnStart", null); + } + + public ApiResponse optionDownloadNewRelease() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionDownloadNewRelease", null); + } + + public ApiResponse optionInstallAddonUpdates() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionInstallAddonUpdates", null); + } + + public ApiResponse optionInstallScannerRules() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionInstallScannerRules", null); + } + + public ApiResponse optionReportAlphaAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionReportAlphaAddons", null); + } + + public ApiResponse optionReportBetaAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionReportBetaAddons", null); + } + + public ApiResponse optionReportReleaseAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "optionReportReleaseAddons", null); + } + + /** Downloads the latest release, if any */ + public ApiResponse downloadLatestRelease() throws ClientApiException { + return api.callApi("autoupdate", "action", "downloadLatestRelease", null); + } + + /** Installs or updates the specified add-on, returning when complete (ie not asynchronously) */ + public ApiResponse installAddon(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("autoupdate", "action", "installAddon", map); + } + + /** Uninstalls the specified add-on */ + public ApiResponse uninstallAddon(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("autoupdate", "action", "uninstallAddon", map); + } + + public ApiResponse setOptionCheckAddonUpdates(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionCheckAddonUpdates", map); + } + + public ApiResponse setOptionCheckOnStart(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionCheckOnStart", map); + } + + public ApiResponse setOptionDownloadNewRelease(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionDownloadNewRelease", map); + } + + public ApiResponse setOptionInstallAddonUpdates(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionInstallAddonUpdates", map); + } + + public ApiResponse setOptionInstallScannerRules(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionInstallScannerRules", map); + } + + public ApiResponse setOptionReportAlphaAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportAlphaAddons", map); + } + + public ApiResponse setOptionReportBetaAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportBetaAddons", map); + } + + public ApiResponse setOptionReportReleaseAddons(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("autoupdate", "action", "setOptionReportReleaseAddons", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index 7f8c25b..245efca 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -25,118 +25,111 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Break extends org.zaproxy.clientapi.gen.deprecated.BreakDeprecated { - private final ClientApi api; - - public Break(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Returns True if ZAP will break on both requests and responses - */ - public ApiResponse isBreakAll() throws ClientApiException { - return api.callApi("break", "view", "isBreakAll", null); - } - - /** - * Returns True if ZAP will break on requests - */ - public ApiResponse isBreakRequest() throws ClientApiException { - return api.callApi("break", "view", "isBreakRequest", null); - } - - /** - * Returns True if ZAP will break on responses - */ - public ApiResponse isBreakResponse() throws ClientApiException { - return api.callApi("break", "view", "isBreakResponse", null); - } - - /** - * Returns the HTTP message currently intercepted (if any) - */ - public ApiResponse httpMessage() throws ClientApiException { - return api.callApi("break", "view", "httpMessage", null); - } - - /** - * Controls the global break functionality. The type may be one of: http-all, http-request or http-response. The state may be true (for turning break on for the specified type) or false (for turning break off). Scope is not currently used. - */ - public ApiResponse brk(String type, String state, String scope) throws ClientApiException { - Map map = new HashMap<>(); - map.put("type", type); - map.put("state", state); - if (scope != null) { - map.put("scope", scope); - } - return api.callApi("break", "action", "break", map); - } - - /** - * Overwrites the currently intercepted message with the data provided - */ - public ApiResponse setHttpMessage(String httpheader, String httpbody) throws ClientApiException { - Map map = new HashMap<>(); - map.put("httpHeader", httpheader); - if (httpbody != null) { - map.put("httpBody", httpbody); - } - return api.callApi("break", "action", "setHttpMessage", map); - } - - /** - * Submits the currently intercepted message and unsets the global request/response break points - */ - public ApiResponse cont() throws ClientApiException { - return api.callApi("break", "action", "continue", null); - } - - /** - * Submits the currently intercepted message, the next request or response will automatically be intercepted - */ - public ApiResponse step() throws ClientApiException { - return api.callApi("break", "action", "step", null); - } - - /** - * Drops the currently intercepted message - */ - public ApiResponse drop() throws ClientApiException { - return api.callApi("break", "action", "drop", null); - } - - /** - * Adds a custom HTTP breakpont. The string is the string to match. Location may be one of: url, request_header, request_body, response_header or response_body. Match may be: contains or regex. Inverse (match) may be true or false. Lastly, ignorecase (when matching the string) may be true or false. - */ - public ApiResponse addHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { - Map map = new HashMap<>(); - map.put("string", string); - map.put("location", location); - map.put("match", match); - map.put("inverse", inverse); - map.put("ignorecase", ignorecase); - return api.callApi("break", "action", "addHttpBreakpoint", map); - } - - /** - * Removes the specified break point - */ - public ApiResponse removeHttpBreakpoint(String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { - Map map = new HashMap<>(); - map.put("string", string); - map.put("location", location); - map.put("match", match); - map.put("inverse", inverse); - map.put("ignorecase", ignorecase); - return api.callApi("break", "action", "removeHttpBreakpoint", map); - } - + private final ClientApi api; + + public Break(ClientApi api) { + super(api); + this.api = api; + } + + /** Returns True if ZAP will break on both requests and responses */ + public ApiResponse isBreakAll() throws ClientApiException { + return api.callApi("break", "view", "isBreakAll", null); + } + + /** Returns True if ZAP will break on requests */ + public ApiResponse isBreakRequest() throws ClientApiException { + return api.callApi("break", "view", "isBreakRequest", null); + } + + /** Returns True if ZAP will break on responses */ + public ApiResponse isBreakResponse() throws ClientApiException { + return api.callApi("break", "view", "isBreakResponse", null); + } + + /** Returns the HTTP message currently intercepted (if any) */ + public ApiResponse httpMessage() throws ClientApiException { + return api.callApi("break", "view", "httpMessage", null); + } + + /** + * Controls the global break functionality. The type may be one of: http-all, http-request or + * http-response. The state may be true (for turning break on for the specified type) or false + * (for turning break off). Scope is not currently used. + */ + public ApiResponse brk(String type, String state, String scope) throws ClientApiException { + Map map = new HashMap<>(); + map.put("type", type); + map.put("state", state); + if (scope != null) { + map.put("scope", scope); + } + return api.callApi("break", "action", "break", map); + } + + /** Overwrites the currently intercepted message with the data provided */ + public ApiResponse setHttpMessage(String httpheader, String httpbody) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("httpHeader", httpheader); + if (httpbody != null) { + map.put("httpBody", httpbody); + } + return api.callApi("break", "action", "setHttpMessage", map); + } + + /** + * Submits the currently intercepted message and unsets the global request/response break points + */ + public ApiResponse cont() throws ClientApiException { + return api.callApi("break", "action", "continue", null); + } + + /** + * Submits the currently intercepted message, the next request or response will automatically be + * intercepted + */ + public ApiResponse step() throws ClientApiException { + return api.callApi("break", "action", "step", null); + } + + /** Drops the currently intercepted message */ + public ApiResponse drop() throws ClientApiException { + return api.callApi("break", "action", "drop", null); + } + + /** + * Adds a custom HTTP breakpont. The string is the string to match. Location may be one of: url, + * request_header, request_body, response_header or response_body. Match may be: contains or + * regex. Inverse (match) may be true or false. Lastly, ignorecase (when matching the string) + * may be true or false. + */ + public ApiResponse addHttpBreakpoint( + String string, String location, String match, String inverse, String ignorecase) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("string", string); + map.put("location", location); + map.put("match", match); + map.put("inverse", inverse); + map.put("ignorecase", ignorecase); + return api.callApi("break", "action", "addHttpBreakpoint", map); + } + + /** Removes the specified break point */ + public ApiResponse removeHttpBreakpoint( + String string, String location, String match, String inverse, String ignorecase) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("string", string); + map.put("location", location); + map.put("match", match); + map.put("inverse", inverse); + map.put("ignorecase", ignorecase); + return api.callApi("break", "action", "removeHttpBreakpoint", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 6644d0c..314727b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -25,182 +25,154 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Context extends org.zaproxy.clientapi.gen.deprecated.ContextDeprecated { - private final ClientApi api; - - public Context(ClientApi api) { - super(api); - this.api = api; - } - - /** - * List context names of current session - */ - public ApiResponse contextList() throws ClientApiException { - return api.callApi("context", "view", "contextList", null); - } - - /** - * List excluded regexs for context - */ - public ApiResponse excludeRegexs(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "view", "excludeRegexs", map); - } - - /** - * List included regexs for context - */ - public ApiResponse includeRegexs(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "view", "includeRegexs", map); - } - - /** - * List the information about the named context - */ - public ApiResponse context(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "view", "context", map); - } - - /** - * Lists the names of all built in technologies - */ - public ApiResponse technologyList() throws ClientApiException { - return api.callApi("context", "view", "technologyList", null); - } - - /** - * Lists the names of all technologies included in a context - */ - public ApiResponse includedTechnologyList(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "view", "includedTechnologyList", map); - } - - /** - * Lists the names of all technologies excluded from a context - */ - public ApiResponse excludedTechnologyList(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "view", "excludedTechnologyList", map); - } - - /** - * Add exclude regex to context - */ - public ApiResponse excludeFromContext(String contextname, String regex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("regex", regex); - return api.callApi("context", "action", "excludeFromContext", map); - } - - /** - * Add include regex to context - */ - public ApiResponse includeInContext(String contextname, String regex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("regex", regex); - return api.callApi("context", "action", "includeInContext", map); - } - - /** - * Creates a new context with the given name in the current session - */ - public ApiResponse newContext(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "action", "newContext", map); - } - - /** - * Removes a context in the current session - */ - public ApiResponse removeContext(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "action", "removeContext", map); - } - - /** - * Exports the context with the given name to a file. If a relative file path is specified it will be resolved against the "contexts" directory in ZAP "home" dir. - */ - public ApiResponse exportContext(String contextname, String contextfile) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("contextFile", contextfile); - return api.callApi("context", "action", "exportContext", map); - } - - /** - * Imports a context from a file. If a relative file path is specified it will be resolved against the "contexts" directory in ZAP "home" dir. - */ - public ApiResponse importContext(String contextfile) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextFile", contextfile); - return api.callApi("context", "action", "importContext", map); - } - - /** - * Includes technologies with the given names, separated by a comma, to a context - */ - public ApiResponse includeContextTechnologies(String contextname, String technologynames) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("technologyNames", technologynames); - return api.callApi("context", "action", "includeContextTechnologies", map); - } - - /** - * Includes all built in technologies in to a context - */ - public ApiResponse includeAllContextTechnologies(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "action", "includeAllContextTechnologies", map); - } - - /** - * Excludes technologies with the given names, separated by a comma, from a context - */ - public ApiResponse excludeContextTechnologies(String contextname, String technologynames) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("technologyNames", technologynames); - return api.callApi("context", "action", "excludeContextTechnologies", map); - } - - /** - * Excludes all built in technologies from a context - */ - public ApiResponse excludeAllContextTechnologies(String contextname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - return api.callApi("context", "action", "excludeAllContextTechnologies", map); - } - - /** - * Sets a context to in scope (contexts are in scope by default) - */ - public ApiResponse setContextInScope(String contextname, String booleaninscope) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextName", contextname); - map.put("booleanInScope", booleaninscope); - return api.callApi("context", "action", "setContextInScope", map); - } - + private final ClientApi api; + + public Context(ClientApi api) { + super(api); + this.api = api; + } + + /** List context names of current session */ + public ApiResponse contextList() throws ClientApiException { + return api.callApi("context", "view", "contextList", null); + } + + /** List excluded regexs for context */ + public ApiResponse excludeRegexs(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "excludeRegexs", map); + } + + /** List included regexs for context */ + public ApiResponse includeRegexs(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "includeRegexs", map); + } + + /** List the information about the named context */ + public ApiResponse context(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "context", map); + } + + /** Lists the names of all built in technologies */ + public ApiResponse technologyList() throws ClientApiException { + return api.callApi("context", "view", "technologyList", null); + } + + /** Lists the names of all technologies included in a context */ + public ApiResponse includedTechnologyList(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "includedTechnologyList", map); + } + + /** Lists the names of all technologies excluded from a context */ + public ApiResponse excludedTechnologyList(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "excludedTechnologyList", map); + } + + /** Add exclude regex to context */ + public ApiResponse excludeFromContext(String contextname, String regex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("regex", regex); + return api.callApi("context", "action", "excludeFromContext", map); + } + + /** Add include regex to context */ + public ApiResponse includeInContext(String contextname, String regex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("regex", regex); + return api.callApi("context", "action", "includeInContext", map); + } + + /** Creates a new context with the given name in the current session */ + public ApiResponse newContext(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "action", "newContext", map); + } + + /** Removes a context in the current session */ + public ApiResponse removeContext(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "action", "removeContext", map); + } + + /** + * Exports the context with the given name to a file. If a relative file path is specified it + * will be resolved against the "contexts" directory in ZAP "home" dir. + */ + public ApiResponse exportContext(String contextname, String contextfile) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("contextFile", contextfile); + return api.callApi("context", "action", "exportContext", map); + } + + /** + * Imports a context from a file. If a relative file path is specified it will be resolved + * against the "contexts" directory in ZAP "home" dir. + */ + public ApiResponse importContext(String contextfile) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextFile", contextfile); + return api.callApi("context", "action", "importContext", map); + } + + /** Includes technologies with the given names, separated by a comma, to a context */ + public ApiResponse includeContextTechnologies(String contextname, String technologynames) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("technologyNames", technologynames); + return api.callApi("context", "action", "includeContextTechnologies", map); + } + + /** Includes all built in technologies in to a context */ + public ApiResponse includeAllContextTechnologies(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "action", "includeAllContextTechnologies", map); + } + + /** Excludes technologies with the given names, separated by a comma, from a context */ + public ApiResponse excludeContextTechnologies(String contextname, String technologynames) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("technologyNames", technologynames); + return api.callApi("context", "action", "excludeContextTechnologies", map); + } + + /** Excludes all built in technologies from a context */ + public ApiResponse excludeAllContextTechnologies(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "action", "excludeAllContextTechnologies", map); + } + + /** Sets a context to in scope (contexts are in scope by default) */ + public ApiResponse setContextInScope(String contextname, String booleaninscope) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("booleanInScope", booleaninscope); + return api.callApi("context", "action", "setContextInScope", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 6b4009e..d6127b6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -25,717 +25,683 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Core extends org.zaproxy.clientapi.gen.deprecated.CoreDeprecated { - private final ClientApi api; - - public Core(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the 'messageId' field and 'message' API method - */ - public ApiResponse alert(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("core", "view", "alert", map); - } - - /** - * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with 'start' position and 'count' of alerts - */ - public ApiResponse alerts(String baseurl, String start, String count, String riskid) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - if (riskid != null) { - map.put("riskId", riskid); - } - return api.callApi("core", "view", "alerts", map); - } - - /** - * Gets number of alerts grouped by each risk level, optionally filtering by URL - */ - public ApiResponse alertsSummary(String baseurl) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - return api.callApi("core", "view", "alertsSummary", map); - } - - /** - * Gets the number of alerts, optionally filtering by URL or riskId - */ - public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (riskid != null) { - map.put("riskId", riskid); - } - return api.callApi("core", "view", "numberOfAlerts", map); - } - - /** - * Gets the name of the hosts accessed through/by ZAP - */ - public ApiResponse hosts() throws ClientApiException { - return api.callApi("core", "view", "hosts", null); - } - - /** - * Gets the sites accessed through/by ZAP (scheme and domain) - */ - public ApiResponse sites() throws ClientApiException { - return api.callApi("core", "view", "sites", null); - } - - /** - * Gets the URLs accessed through/by ZAP, optionally filtering by (base) URL. - */ - public ApiResponse urls(String baseurl) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - return api.callApi("core", "view", "urls", map); - } - - /** - * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, cookies, note, type, RTT, and timestamp. - */ - public ApiResponse message(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("core", "view", "message", map); - } - - /** - * Gets the HTTP messages sent by ZAP, request and response, optionally filtered by URL and paginated with 'start' position and 'count' of messages - */ - public ApiResponse messages(String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("core", "view", "messages", map); - } - - /** - * Gets the HTTP messages with the given IDs. - */ - public ApiResponse messagesById(String ids) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - return api.callApi("core", "view", "messagesById", map); - } - - /** - * Gets the number of messages, optionally filtering by URL - */ - public ApiResponse numberOfMessages(String baseurl) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - return api.callApi("core", "view", "numberOfMessages", map); - } - - /** - * Gets the mode - */ - public ApiResponse mode() throws ClientApiException { - return api.callApi("core", "view", "mode", null); - } - - /** - * Gets ZAP version - */ - public ApiResponse version() throws ClientApiException { - return api.callApi("core", "view", "version", null); - } - - /** - * Gets the regular expressions, applied to URLs, to exclude from the local proxies. - */ - public ApiResponse excludedFromProxy() throws ClientApiException { - return api.callApi("core", "view", "excludedFromProxy", null); - } - - public ApiResponse homeDirectory() throws ClientApiException { - return api.callApi("core", "view", "homeDirectory", null); - } - - /** - * Gets the location of the current session file - */ - public ApiResponse sessionLocation() throws ClientApiException { - return api.callApi("core", "view", "sessionLocation", null); - } - - /** - * Gets all the domains that are excluded from the outgoing proxy. For each domain the following are shown: the index, the value (domain), if enabled, and if specified as a regex. - */ - public ApiResponse proxyChainExcludedDomains() throws ClientApiException { - return api.callApi("core", "view", "proxyChainExcludedDomains", null); - } - - /** - * Use view proxyChainExcludedDomains instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionProxyChainSkipName() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainSkipName", null); - } - - /** - * Use view proxyChainExcludedDomains instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionProxyExcludedDomains() throws ClientApiException { - return api.callApi("core", "view", "optionProxyExcludedDomains", null); - } - - /** - * Use view proxyChainExcludedDomains instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException { - return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); - } - - /** - * Gets the path to ZAP's home directory. - */ - public ApiResponse zapHomePath() throws ClientApiException { - return api.callApi("core", "view", "zapHomePath", null); - } - - /** - * Gets the maximum number of alert instances to include in a report. - */ - public ApiResponse optionMaximumAlertInstances() throws ClientApiException { - return api.callApi("core", "view", "optionMaximumAlertInstances", null); - } - - /** - * Gets whether or not related alerts will be merged in any reports generated. - */ - public ApiResponse optionMergeRelatedAlerts() throws ClientApiException { - return api.callApi("core", "view", "optionMergeRelatedAlerts", null); - } - - /** - * Gets the path to the file with alert overrides. - */ - public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { - return api.callApi("core", "view", "optionAlertOverridesFilePath", null); - } - - /** - * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider messages or CONNECT requests to outgoing proxy). - */ - public ApiResponse optionDefaultUserAgent() throws ClientApiException { - return api.callApi("core", "view", "optionDefaultUserAgent", null); - } - - /** - * Gets the TTL (in seconds) of successful DNS queries. - */ - public ApiResponse optionDnsTtlSuccessfulQueries() throws ClientApiException { - return api.callApi("core", "view", "optionDnsTtlSuccessfulQueries", null); - } - - public ApiResponse optionHttpState() throws ClientApiException { - return api.callApi("core", "view", "optionHttpState", null); - } - - public ApiResponse optionProxyChainName() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainName", null); - } - - public ApiResponse optionProxyChainPassword() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainPassword", null); - } - - public ApiResponse optionProxyChainPort() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainPort", null); - } - - public ApiResponse optionProxyChainRealm() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainRealm", null); - } - - public ApiResponse optionProxyChainUserName() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainUserName", null); - } - - public ApiResponse optionTimeoutInSecs() throws ClientApiException { - return api.callApi("core", "view", "optionTimeoutInSecs", null); - } - - public ApiResponse optionHttpStateEnabled() throws ClientApiException { - return api.callApi("core", "view", "optionHttpStateEnabled", null); - } - - public ApiResponse optionProxyChainPrompt() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainPrompt", null); - } - - public ApiResponse optionSingleCookieRequestHeader() throws ClientApiException { - return api.callApi("core", "view", "optionSingleCookieRequestHeader", null); - } - - public ApiResponse optionUseProxyChain() throws ClientApiException { - return api.callApi("core", "view", "optionUseProxyChain", null); - } - - public ApiResponse optionUseProxyChainAuth() throws ClientApiException { - return api.callApi("core", "view", "optionUseProxyChainAuth", null); - } - - /** - * Convenient and simple action to access a URL, optionally following redirections. Returns the request sent and response received and followed redirections, if any. Other actions are available which offer more control on what is sent, like, 'sendRequest' or 'sendHarRequest'. - */ - public ApiResponse accessUrl(String url, String followredirects) throws ClientApiException { - Map map = new HashMap<>(); - map.put("url", url); - if (followredirects != null) { - map.put("followRedirects", followredirects); - } - return api.callApi("core", "action", "accessUrl", map); - } - - /** - * Shuts down ZAP - */ - public ApiResponse shutdown() throws ClientApiException { - return api.callApi("core", "action", "shutdown", null); - } - - /** - * Creates a new session, optionally overwriting existing files. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. - */ - public ApiResponse newSession(String name, String overwrite) throws ClientApiException { - Map map = new HashMap<>(); - if (name != null) { - map.put("name", name); - } - if (overwrite != null) { - map.put("overwrite", overwrite); - } - return api.callApi("core", "action", "newSession", map); - } - - /** - * Loads the session with the given name. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. - */ - public ApiResponse loadSession(String name) throws ClientApiException { - Map map = new HashMap<>(); - map.put("name", name); - return api.callApi("core", "action", "loadSession", map); - } - - /** - * Saves the session with the name supplied, optionally overwriting existing files. If a relative path is specified it will be resolved against the "session" directory in ZAP "home" dir. - */ - public ApiResponse saveSession(String name, String overwrite) throws ClientApiException { - Map map = new HashMap<>(); - map.put("name", name); - if (overwrite != null) { - map.put("overwrite", overwrite); - } - return api.callApi("core", "action", "saveSession", map); - } - - public ApiResponse snapshotSession() throws ClientApiException { - return api.callApi("core", "action", "snapshotSession", null); - } - - /** - * Clears the regexes of URLs excluded from the local proxies. - */ - public ApiResponse clearExcludedFromProxy() throws ClientApiException { - return api.callApi("core", "action", "clearExcludedFromProxy", null); - } - - /** - * Adds a regex of URLs that should be excluded from the local proxies. - */ - public ApiResponse excludeFromProxy(String regex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - return api.callApi("core", "action", "excludeFromProxy", map); - } - - public ApiResponse setHomeDirectory(String dir) throws ClientApiException { - Map map = new HashMap<>(); - map.put("dir", dir); - return api.callApi("core", "action", "setHomeDirectory", map); - } - - /** - * Sets the mode, which may be one of [safe, protect, standard, attack] - */ - public ApiResponse setMode(String mode) throws ClientApiException { - Map map = new HashMap<>(); - map.put("mode", mode); - return api.callApi("core", "action", "setMode", map); - } - - /** - * Generates a new Root CA certificate for the local proxies. - */ - public ApiResponse generateRootCA() throws ClientApiException { - return api.callApi("core", "action", "generateRootCA", null); - } - - /** - * Sends the HTTP request, optionally following redirections. Returns the request sent and response received and followed redirections, if any. The Mode is enforced when sending the request (and following redirections), custom manual requests are not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. - */ - public ApiResponse sendRequest(String request, String followredirects) throws ClientApiException { - Map map = new HashMap<>(); - map.put("request", request); - if (followredirects != null) { - map.put("followRedirects", followredirects); - } - return api.callApi("core", "action", "sendRequest", map); - } - - /** - * Deletes all alerts of the current session. - */ - public ApiResponse deleteAllAlerts() throws ClientApiException { - return api.callApi("core", "action", "deleteAllAlerts", null); - } - - /** - * Deletes the alert with the given ID. - */ - public ApiResponse deleteAlert(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("core", "action", "deleteAlert", map); - } - - public ApiResponse runGarbageCollection() throws ClientApiException { - return api.callApi("core", "action", "runGarbageCollection", null); - } - - /** - * Deletes the site node found in the Sites Tree on the basis of the URL, HTTP method, and post data (if applicable and specified). - */ - public ApiResponse deleteSiteNode(String url, String method, String postdata) throws ClientApiException { - Map map = new HashMap<>(); - map.put("url", url); - if (method != null) { - map.put("method", method); - } - if (postdata != null) { - map.put("postData", postdata); - } - return api.callApi("core", "action", "deleteSiteNode", map); - } - - /** - * Adds a domain to be excluded from the outgoing proxy, using the specified value. Optionally sets if the new entry is enabled (default, true) and whether or not the new value is specified as a regex (default, false). - */ - public ApiResponse addProxyChainExcludedDomain(String value, String isregex, String isenabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("value", value); - if (isregex != null) { - map.put("isRegex", isregex); - } - if (isenabled != null) { - map.put("isEnabled", isenabled); - } - return api.callApi("core", "action", "addProxyChainExcludedDomain", map); - } - - /** - * Modifies a domain excluded from the outgoing proxy. Allows to modify the value, if enabled or if a regex. The domain is selected with its index, which can be obtained with the view proxyChainExcludedDomains. - */ - public ApiResponse modifyProxyChainExcludedDomain(String idx, String value, String isregex, String isenabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - if (value != null) { - map.put("value", value); - } - if (isregex != null) { - map.put("isRegex", isregex); - } - if (isenabled != null) { - map.put("isEnabled", isenabled); - } - return api.callApi("core", "action", "modifyProxyChainExcludedDomain", map); - } - - /** - * Removes a domain excluded from the outgoing proxy, with the given index. The index can be obtained with the view proxyChainExcludedDomains. - */ - public ApiResponse removeProxyChainExcludedDomain(String idx) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - return api.callApi("core", "action", "removeProxyChainExcludedDomain", map); - } - - /** - * Enables all domains excluded from the outgoing proxy. - */ - public ApiResponse enableAllProxyChainExcludedDomains() throws ClientApiException { - return api.callApi("core", "action", "enableAllProxyChainExcludedDomains", null); - } - - /** - * Disables all domains excluded from the outgoing proxy. - */ - public ApiResponse disableAllProxyChainExcludedDomains() throws ClientApiException { - return api.callApi("core", "action", "disableAllProxyChainExcludedDomains", null); - } - - /** - * Sets the maximum number of alert instances to include in a report. A value of zero is treated as unlimited. - */ - public ApiResponse setOptionMaximumAlertInstances(String numberofinstances) throws ClientApiException { - Map map = new HashMap<>(); - map.put("numberOfInstances", numberofinstances); - return api.callApi("core", "action", "setOptionMaximumAlertInstances", map); - } - - /** - * Sets whether or not related alerts will be merged in any reports generated. - */ - public ApiResponse setOptionMergeRelatedAlerts(String enabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("enabled", enabled); - return api.callApi("core", "action", "setOptionMergeRelatedAlerts", map); - } - - /** - * Sets (or clears, if empty) the path to the file with alert overrides. - */ - public ApiResponse setOptionAlertOverridesFilePath(String filepath) throws ClientApiException { - Map map = new HashMap<>(); - if (filepath != null) { - map.put("filePath", filepath); - } - return api.callApi("core", "action", "setOptionAlertOverridesFilePath", map); - } - - /** - * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider messages or CONNECT requests to outgoing proxy). - */ - public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionDefaultUserAgent", map); - } - - public ApiResponse setOptionProxyChainName(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionProxyChainName", map); - } - - public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionProxyChainPassword", map); - } - - public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionProxyChainRealm", map); - } - - /** - * Use actions [add|modify|remove]ProxyChainExcludedDomain instead. - * @deprecated - */ - @Deprecated - public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionProxyChainSkipName", map); - } - - public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("core", "action", "setOptionProxyChainUserName", map); - } - - /** - * Sets the TTL (in seconds) of successful DNS queries (applies after ZAP restart). - */ - public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); - } - - public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionHttpStateEnabled", map); - } - - public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("core", "action", "setOptionProxyChainPort", map); - } - - public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionProxyChainPrompt", map); - } - - public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); - } - - public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("core", "action", "setOptionTimeoutInSecs", map); - } - - /** - * Sets whether or not the outgoing proxy should be used. The address/hostname of the outgoing proxy must be set to enable this option. - */ - public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionUseProxyChain", map); - } - - public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); - } - - public byte[] proxypac() throws ClientApiException { - return api.callApiOther("core", "other", "proxy.pac", null); - } - - /** - * Gets the Root CA certificate used by the local proxies. - */ - public byte[] rootcert() throws ClientApiException { - return api.callApiOther("core", "other", "rootcert", null); - } - - public byte[] setproxy(String proxy) throws ClientApiException { - Map map = new HashMap<>(); - map.put("proxy", proxy); - return api.callApiOther("core", "other", "setproxy", map); - } - - /** - * Generates a report in XML format - */ - public byte[] xmlreport() throws ClientApiException { - return api.callApiOther("core", "other", "xmlreport", null); - } - - /** - * Generates a report in HTML format - */ - public byte[] htmlreport() throws ClientApiException { - return api.callApiOther("core", "other", "htmlreport", null); - } - - /** - * Generates a report in JSON format - */ - public byte[] jsonreport() throws ClientApiException { - return api.callApiOther("core", "other", "jsonreport", null); - } - - /** - * Generates a report in Markdown format - */ - public byte[] mdreport() throws ClientApiException { - return api.callApiOther("core", "other", "mdreport", null); - } - - /** - * Gets the message with the given ID in HAR format - */ - public byte[] messageHar(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApiOther("core", "other", "messageHar", map); - } - - /** - * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and paginated with 'start' position and 'count' of messages - */ - public byte[] messagesHar(String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApiOther("core", "other", "messagesHar", map); - } - - /** - * Gets the HTTP messages with the given IDs, in HAR format. - */ - public byte[] messagesHarById(String ids) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - return api.callApiOther("core", "other", "messagesHarById", map); - } - - /** - * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, the request sent and response received and followed redirections, if any. The Mode is enforced when sending the request (and following redirections), custom manual requests are not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. - */ - public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { - Map map = new HashMap<>(); - map.put("request", request); - if (followredirects != null) { - map.put("followRedirects", followredirects); - } - return api.callApiOther("core", "other", "sendHarRequest", map); - } - + private final ClientApi api; + + public Core(ClientApi api) { + super(api); + this.api = api; + } + + /** + * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the + * 'messageId' field and 'message' API method + */ + public ApiResponse alert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "view", "alert", map); + } + + /** + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with + * 'start' position and 'count' of alerts + */ + public ApiResponse alerts(String baseurl, String start, String count, String riskid) + throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("core", "view", "alerts", map); + } + + /** Gets number of alerts grouped by each risk level, optionally filtering by URL */ + public ApiResponse alertsSummary(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "alertsSummary", map); + } + + /** Gets the number of alerts, optionally filtering by URL or riskId */ + public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("core", "view", "numberOfAlerts", map); + } + + /** Gets the name of the hosts accessed through/by ZAP */ + public ApiResponse hosts() throws ClientApiException { + return api.callApi("core", "view", "hosts", null); + } + + /** Gets the sites accessed through/by ZAP (scheme and domain) */ + public ApiResponse sites() throws ClientApiException { + return api.callApi("core", "view", "sites", null); + } + + /** Gets the URLs accessed through/by ZAP, optionally filtering by (base) URL. */ + public ApiResponse urls(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "urls", map); + } + + /** + * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, + * cookies, note, type, RTT, and timestamp. + */ + public ApiResponse message(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "view", "message", map); + } + + /** + * Gets the HTTP messages sent by ZAP, request and response, optionally filtered by URL and + * paginated with 'start' position and 'count' of messages + */ + public ApiResponse messages(String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("core", "view", "messages", map); + } + + /** Gets the HTTP messages with the given IDs. */ + public ApiResponse messagesById(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApi("core", "view", "messagesById", map); + } + + /** Gets the number of messages, optionally filtering by URL */ + public ApiResponse numberOfMessages(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "numberOfMessages", map); + } + + /** Gets the mode */ + public ApiResponse mode() throws ClientApiException { + return api.callApi("core", "view", "mode", null); + } + + /** Gets ZAP version */ + public ApiResponse version() throws ClientApiException { + return api.callApi("core", "view", "version", null); + } + + /** Gets the regular expressions, applied to URLs, to exclude from the local proxies. */ + public ApiResponse excludedFromProxy() throws ClientApiException { + return api.callApi("core", "view", "excludedFromProxy", null); + } + + public ApiResponse homeDirectory() throws ClientApiException { + return api.callApi("core", "view", "homeDirectory", null); + } + + /** Gets the location of the current session file */ + public ApiResponse sessionLocation() throws ClientApiException { + return api.callApi("core", "view", "sessionLocation", null); + } + + /** + * Gets all the domains that are excluded from the outgoing proxy. For each domain the following + * are shown: the index, the value (domain), if enabled, and if specified as a regex. + */ + public ApiResponse proxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "view", "proxyChainExcludedDomains", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyChainSkipName() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainSkipName", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyExcludedDomains() throws ClientApiException { + return api.callApi("core", "view", "optionProxyExcludedDomains", null); + } + + /** + * Use view proxyChainExcludedDomains instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException { + return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); + } + + /** Gets the path to ZAP's home directory. */ + public ApiResponse zapHomePath() throws ClientApiException { + return api.callApi("core", "view", "zapHomePath", null); + } + + /** Gets the maximum number of alert instances to include in a report. */ + public ApiResponse optionMaximumAlertInstances() throws ClientApiException { + return api.callApi("core", "view", "optionMaximumAlertInstances", null); + } + + /** Gets whether or not related alerts will be merged in any reports generated. */ + public ApiResponse optionMergeRelatedAlerts() throws ClientApiException { + return api.callApi("core", "view", "optionMergeRelatedAlerts", null); + } + + /** Gets the path to the file with alert overrides. */ + public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { + return api.callApi("core", "view", "optionAlertOverridesFilePath", null); + } + + /** + * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider + * messages or CONNECT requests to outgoing proxy). + */ + public ApiResponse optionDefaultUserAgent() throws ClientApiException { + return api.callApi("core", "view", "optionDefaultUserAgent", null); + } + + /** Gets the TTL (in seconds) of successful DNS queries. */ + public ApiResponse optionDnsTtlSuccessfulQueries() throws ClientApiException { + return api.callApi("core", "view", "optionDnsTtlSuccessfulQueries", null); + } + + public ApiResponse optionHttpState() throws ClientApiException { + return api.callApi("core", "view", "optionHttpState", null); + } + + public ApiResponse optionProxyChainName() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainName", null); + } + + public ApiResponse optionProxyChainPassword() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainPassword", null); + } + + public ApiResponse optionProxyChainPort() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainPort", null); + } + + public ApiResponse optionProxyChainRealm() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainRealm", null); + } + + public ApiResponse optionProxyChainUserName() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainUserName", null); + } + + public ApiResponse optionTimeoutInSecs() throws ClientApiException { + return api.callApi("core", "view", "optionTimeoutInSecs", null); + } + + public ApiResponse optionHttpStateEnabled() throws ClientApiException { + return api.callApi("core", "view", "optionHttpStateEnabled", null); + } + + public ApiResponse optionProxyChainPrompt() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainPrompt", null); + } + + public ApiResponse optionSingleCookieRequestHeader() throws ClientApiException { + return api.callApi("core", "view", "optionSingleCookieRequestHeader", null); + } + + public ApiResponse optionUseProxyChain() throws ClientApiException { + return api.callApi("core", "view", "optionUseProxyChain", null); + } + + public ApiResponse optionUseProxyChainAuth() throws ClientApiException { + return api.callApi("core", "view", "optionUseProxyChainAuth", null); + } + + /** + * Convenient and simple action to access a URL, optionally following redirections. Returns the + * request sent and response received and followed redirections, if any. Other actions are + * available which offer more control on what is sent, like, 'sendRequest' or 'sendHarRequest'. + */ + public ApiResponse accessUrl(String url, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApi("core", "action", "accessUrl", map); + } + + /** Shuts down ZAP */ + public ApiResponse shutdown() throws ClientApiException { + return api.callApi("core", "action", "shutdown", null); + } + + /** + * Creates a new session, optionally overwriting existing files. If a relative path is specified + * it will be resolved against the "session" directory in ZAP "home" dir. + */ + public ApiResponse newSession(String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); + if (name != null) { + map.put("name", name); + } + if (overwrite != null) { + map.put("overwrite", overwrite); + } + return api.callApi("core", "action", "newSession", map); + } + + /** + * Loads the session with the given name. If a relative path is specified it will be resolved + * against the "session" directory in ZAP "home" dir. + */ + public ApiResponse loadSession(String name) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + return api.callApi("core", "action", "loadSession", map); + } + + /** + * Saves the session with the name supplied, optionally overwriting existing files. If a + * relative path is specified it will be resolved against the "session" directory in ZAP "home" + * dir. + */ + public ApiResponse saveSession(String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + if (overwrite != null) { + map.put("overwrite", overwrite); + } + return api.callApi("core", "action", "saveSession", map); + } + + public ApiResponse snapshotSession() throws ClientApiException { + return api.callApi("core", "action", "snapshotSession", null); + } + + /** Clears the regexes of URLs excluded from the local proxies. */ + public ApiResponse clearExcludedFromProxy() throws ClientApiException { + return api.callApi("core", "action", "clearExcludedFromProxy", null); + } + + /** Adds a regex of URLs that should be excluded from the local proxies. */ + public ApiResponse excludeFromProxy(String regex) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + return api.callApi("core", "action", "excludeFromProxy", map); + } + + public ApiResponse setHomeDirectory(String dir) throws ClientApiException { + Map map = new HashMap<>(); + map.put("dir", dir); + return api.callApi("core", "action", "setHomeDirectory", map); + } + + /** Sets the mode, which may be one of [safe, protect, standard, attack] */ + public ApiResponse setMode(String mode) throws ClientApiException { + Map map = new HashMap<>(); + map.put("mode", mode); + return api.callApi("core", "action", "setMode", map); + } + + /** Generates a new Root CA certificate for the local proxies. */ + public ApiResponse generateRootCA() throws ClientApiException { + return api.callApi("core", "action", "generateRootCA", null); + } + + /** + * Sends the HTTP request, optionally following redirections. Returns the request sent and + * response received and followed redirections, if any. The Mode is enforced when sending the + * request (and following redirections), custom manual requests are not allowed in 'Safe' mode + * nor in 'Protected' mode if out of scope. + */ + public ApiResponse sendRequest(String request, String followredirects) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("request", request); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApi("core", "action", "sendRequest", map); + } + + /** Deletes all alerts of the current session. */ + public ApiResponse deleteAllAlerts() throws ClientApiException { + return api.callApi("core", "action", "deleteAllAlerts", null); + } + + /** Deletes the alert with the given ID. */ + public ApiResponse deleteAlert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "action", "deleteAlert", map); + } + + public ApiResponse runGarbageCollection() throws ClientApiException { + return api.callApi("core", "action", "runGarbageCollection", null); + } + + /** + * Deletes the site node found in the Sites Tree on the basis of the URL, HTTP method, and post + * data (if applicable and specified). + */ + public ApiResponse deleteSiteNode(String url, String method, String postdata) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + if (method != null) { + map.put("method", method); + } + if (postdata != null) { + map.put("postData", postdata); + } + return api.callApi("core", "action", "deleteSiteNode", map); + } + + /** + * Adds a domain to be excluded from the outgoing proxy, using the specified value. Optionally + * sets if the new entry is enabled (default, true) and whether or not the new value is + * specified as a regex (default, false). + */ + public ApiResponse addProxyChainExcludedDomain(String value, String isregex, String isenabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("value", value); + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("core", "action", "addProxyChainExcludedDomain", map); + } + + /** + * Modifies a domain excluded from the outgoing proxy. Allows to modify the value, if enabled or + * if a regex. The domain is selected with its index, which can be obtained with the view + * proxyChainExcludedDomains. + */ + public ApiResponse modifyProxyChainExcludedDomain( + String idx, String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (value != null) { + map.put("value", value); + } + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("core", "action", "modifyProxyChainExcludedDomain", map); + } + + /** + * Removes a domain excluded from the outgoing proxy, with the given index. The index can be + * obtained with the view proxyChainExcludedDomains. + */ + public ApiResponse removeProxyChainExcludedDomain(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("core", "action", "removeProxyChainExcludedDomain", map); + } + + /** Enables all domains excluded from the outgoing proxy. */ + public ApiResponse enableAllProxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "action", "enableAllProxyChainExcludedDomains", null); + } + + /** Disables all domains excluded from the outgoing proxy. */ + public ApiResponse disableAllProxyChainExcludedDomains() throws ClientApiException { + return api.callApi("core", "action", "disableAllProxyChainExcludedDomains", null); + } + + /** + * Sets the maximum number of alert instances to include in a report. A value of zero is treated + * as unlimited. + */ + public ApiResponse setOptionMaximumAlertInstances(String numberofinstances) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("numberOfInstances", numberofinstances); + return api.callApi("core", "action", "setOptionMaximumAlertInstances", map); + } + + /** Sets whether or not related alerts will be merged in any reports generated. */ + public ApiResponse setOptionMergeRelatedAlerts(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("core", "action", "setOptionMergeRelatedAlerts", map); + } + + /** Sets (or clears, if empty) the path to the file with alert overrides. */ + public ApiResponse setOptionAlertOverridesFilePath(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + if (filepath != null) { + map.put("filePath", filepath); + } + return api.callApi("core", "action", "setOptionAlertOverridesFilePath", map); + } + + /** + * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider + * messages or CONNECT requests to outgoing proxy). + */ + public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionDefaultUserAgent", map); + } + + public ApiResponse setOptionProxyChainName(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainName", map); + } + + public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainPassword", map); + } + + public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainRealm", map); + } + + /** + * Use actions [add|modify|remove]ProxyChainExcludedDomain instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainSkipName", map); + } + + public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("core", "action", "setOptionProxyChainUserName", map); + } + + /** Sets the TTL (in seconds) of successful DNS queries (applies after ZAP restart). */ + public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); + } + + public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionHttpStateEnabled", map); + } + + public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionProxyChainPort", map); + } + + public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionProxyChainPrompt", map); + } + + public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); + } + + public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionTimeoutInSecs", map); + } + + /** + * Sets whether or not the outgoing proxy should be used. The address/hostname of the outgoing + * proxy must be set to enable this option. + */ + public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionUseProxyChain", map); + } + + public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); + } + + public byte[] proxypac() throws ClientApiException { + return api.callApiOther("core", "other", "proxy.pac", null); + } + + /** Gets the Root CA certificate used by the local proxies. */ + public byte[] rootcert() throws ClientApiException { + return api.callApiOther("core", "other", "rootcert", null); + } + + public byte[] setproxy(String proxy) throws ClientApiException { + Map map = new HashMap<>(); + map.put("proxy", proxy); + return api.callApiOther("core", "other", "setproxy", map); + } + + /** Generates a report in XML format */ + public byte[] xmlreport() throws ClientApiException { + return api.callApiOther("core", "other", "xmlreport", null); + } + + /** Generates a report in HTML format */ + public byte[] htmlreport() throws ClientApiException { + return api.callApiOther("core", "other", "htmlreport", null); + } + + /** Generates a report in JSON format */ + public byte[] jsonreport() throws ClientApiException { + return api.callApiOther("core", "other", "jsonreport", null); + } + + /** Generates a report in Markdown format */ + public byte[] mdreport() throws ClientApiException { + return api.callApiOther("core", "other", "mdreport", null); + } + + /** Gets the message with the given ID in HAR format */ + public byte[] messageHar(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApiOther("core", "other", "messageHar", map); + } + + /** + * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and + * paginated with 'start' position and 'count' of messages + */ + public byte[] messagesHar(String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("core", "other", "messagesHar", map); + } + + /** Gets the HTTP messages with the given IDs, in HAR format. */ + public byte[] messagesHarById(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApiOther("core", "other", "messagesHarById", map); + } + + /** + * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, + * the request sent and response received and followed redirections, if any. The Mode is + * enforced when sending the request (and following redirections), custom manual requests are + * not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. + */ + public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + map.put("request", request); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApiOther("core", "other", "sendHarRequest", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java index 8d5c198..e91f5ca 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ForcedUser.java @@ -25,53 +25,41 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class ForcedUser extends org.zaproxy.clientapi.gen.deprecated.ForcedUserDeprecated { - private final ClientApi api; - - public ForcedUser(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * Returns 'true' if 'forced user' mode is enabled, 'false' otherwise - */ - public ApiResponse isForcedUserModeEnabled() throws ClientApiException { - return api.callApi("forcedUser", "view", "isForcedUserModeEnabled", null); - } + public ForcedUser(ClientApi api) { + super(api); + this.api = api; + } - /** - * Gets the user (ID) set as 'forced user' for the given context (ID) - */ - public ApiResponse getForcedUser(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("forcedUser", "view", "getForcedUser", map); - } + /** Returns 'true' if 'forced user' mode is enabled, 'false' otherwise */ + public ApiResponse isForcedUserModeEnabled() throws ClientApiException { + return api.callApi("forcedUser", "view", "isForcedUserModeEnabled", null); + } - /** - * Sets the user (ID) that should be used in 'forced user' mode for the given context (ID) - */ - public ApiResponse setForcedUser(String contextid, String userid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - return api.callApi("forcedUser", "action", "setForcedUser", map); - } + /** Gets the user (ID) set as 'forced user' for the given context (ID) */ + public ApiResponse getForcedUser(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("forcedUser", "view", "getForcedUser", map); + } - /** - * Sets if 'forced user' mode should be enabled or not - */ - public ApiResponse setForcedUserModeEnabled(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("boolean", Boolean.toString(bool)); - return api.callApi("forcedUser", "action", "setForcedUserModeEnabled", map); - } + /** Sets the user (ID) that should be used in 'forced user' mode for the given context (ID) */ + public ApiResponse setForcedUser(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("forcedUser", "action", "setForcedUser", map); + } + /** Sets if 'forced user' mode should be enabled or not */ + public ApiResponse setForcedUserModeEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("boolean", Boolean.toString(bool)); + return api.callApi("forcedUser", "action", "setForcedUserModeEnabled", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index f5c4d38..12215e3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -25,139 +25,118 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class HttpSessions extends org.zaproxy.clientapi.gen.deprecated.HttpSessionsDeprecated { - private final ClientApi api; - - public HttpSessions(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Gets all of the sites that have sessions. - */ - public ApiResponse sites() throws ClientApiException { - return api.callApi("httpSessions", "view", "sites", null); - } - - /** - * Gets the sessions for the given site. Optionally returning just the session with the given name. - */ - public ApiResponse sessions(String site, String session) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - if (session != null) { - map.put("session", session); - } - return api.callApi("httpSessions", "view", "sessions", map); - } - - /** - * Gets the name of the active session for the given site. - */ - public ApiResponse activeSession(String site) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - return api.callApi("httpSessions", "view", "activeSession", map); - } - - /** - * Gets the names of the session tokens for the given site. - */ - public ApiResponse sessionTokens(String site) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - return api.callApi("httpSessions", "view", "sessionTokens", map); - } - - /** - * Creates an empty session for the given site. Optionally with the given name. - */ - public ApiResponse createEmptySession(String site, String session) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - if (session != null) { - map.put("session", session); - } - return api.callApi("httpSessions", "action", "createEmptySession", map); - } - - /** - * Removes the session from the given site. - */ - public ApiResponse removeSession(String site, String session) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("session", session); - return api.callApi("httpSessions", "action", "removeSession", map); - } - - /** - * Sets the given session as active for the given site. - */ - public ApiResponse setActiveSession(String site, String session) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("session", session); - return api.callApi("httpSessions", "action", "setActiveSession", map); - } - - /** - * Unsets the active session of the given site. - */ - public ApiResponse unsetActiveSession(String site) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - return api.callApi("httpSessions", "action", "unsetActiveSession", map); - } - - /** - * Adds the session token to the given site. - */ - public ApiResponse addSessionToken(String site, String sessiontoken) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("sessionToken", sessiontoken); - return api.callApi("httpSessions", "action", "addSessionToken", map); - } - - /** - * Removes the session token from the given site. - */ - public ApiResponse removeSessionToken(String site, String sessiontoken) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("sessionToken", sessiontoken); - return api.callApi("httpSessions", "action", "removeSessionToken", map); - } - - /** - * Sets the value of the session token of the given session for the given site. - */ - public ApiResponse setSessionTokenValue(String site, String session, String sessiontoken, String tokenvalue) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("session", session); - map.put("sessionToken", sessiontoken); - map.put("tokenValue", tokenvalue); - return api.callApi("httpSessions", "action", "setSessionTokenValue", map); - } - - /** - * Renames the session of the given site. - */ - public ApiResponse renameSession(String site, String oldsessionname, String newsessionname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - map.put("oldSessionName", oldsessionname); - map.put("newSessionName", newsessionname); - return api.callApi("httpSessions", "action", "renameSession", map); - } - + private final ClientApi api; + + public HttpSessions(ClientApi api) { + super(api); + this.api = api; + } + + /** Gets all of the sites that have sessions. */ + public ApiResponse sites() throws ClientApiException { + return api.callApi("httpSessions", "view", "sites", null); + } + + /** + * Gets the sessions for the given site. Optionally returning just the session with the given + * name. + */ + public ApiResponse sessions(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + if (session != null) { + map.put("session", session); + } + return api.callApi("httpSessions", "view", "sessions", map); + } + + /** Gets the name of the active session for the given site. */ + public ApiResponse activeSession(String site) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + return api.callApi("httpSessions", "view", "activeSession", map); + } + + /** Gets the names of the session tokens for the given site. */ + public ApiResponse sessionTokens(String site) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + return api.callApi("httpSessions", "view", "sessionTokens", map); + } + + /** Creates an empty session for the given site. Optionally with the given name. */ + public ApiResponse createEmptySession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + if (session != null) { + map.put("session", session); + } + return api.callApi("httpSessions", "action", "createEmptySession", map); + } + + /** Removes the session from the given site. */ + public ApiResponse removeSession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("session", session); + return api.callApi("httpSessions", "action", "removeSession", map); + } + + /** Sets the given session as active for the given site. */ + public ApiResponse setActiveSession(String site, String session) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("session", session); + return api.callApi("httpSessions", "action", "setActiveSession", map); + } + + /** Unsets the active session of the given site. */ + public ApiResponse unsetActiveSession(String site) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + return api.callApi("httpSessions", "action", "unsetActiveSession", map); + } + + /** Adds the session token to the given site. */ + public ApiResponse addSessionToken(String site, String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("sessionToken", sessiontoken); + return api.callApi("httpSessions", "action", "addSessionToken", map); + } + + /** Removes the session token from the given site. */ + public ApiResponse removeSessionToken(String site, String sessiontoken) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("sessionToken", sessiontoken); + return api.callApi("httpSessions", "action", "removeSessionToken", map); + } + + /** Sets the value of the session token of the given session for the given site. */ + public ApiResponse setSessionTokenValue( + String site, String session, String sessiontoken, String tokenvalue) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("session", session); + map.put("sessionToken", sessiontoken); + map.put("tokenValue", tokenvalue); + return api.callApi("httpSessions", "action", "setSessionTokenValue", map); + } + + /** Renames the session of the given site. */ + public ApiResponse renameSession(String site, String oldsessionname, String newsessionname) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("oldSessionName", oldsessionname); + map.put("newSessionName", newsessionname); + return api.callApi("httpSessions", "action", "renameSession", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java index 81b022b..05f42ba 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java @@ -25,66 +25,55 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class ImportLogFiles extends org.zaproxy.clientapi.gen.deprecated.ImportLogFilesDeprecated { - private final ClientApi api; - - public ImportLogFiles(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse ImportZAPLogFromFile(String filepath) throws ClientApiException { - Map map = new HashMap<>(); - map.put("FilePath", filepath); - return api.callApi("importLogFiles", "action", "ImportZAPLogFromFile", map); - } + public ImportLogFiles(ClientApi api) { + super(api); + this.api = api; + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse ImportModSecurityLogFromFile(String filepath) throws ClientApiException { - Map map = new HashMap<>(); - map.put("FilePath", filepath); - return api.callApi("importLogFiles", "action", "ImportModSecurityLogFromFile", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse ImportZAPLogFromFile(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("FilePath", filepath); + return api.callApi("importLogFiles", "action", "ImportZAPLogFromFile", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse ImportZAPHttpRequestResponsePair(String httprequest, String httpresponse) throws ClientApiException { - Map map = new HashMap<>(); - map.put("HTTPRequest", httprequest); - map.put("HTTPResponse", httpresponse); - return api.callApi("importLogFiles", "action", "ImportZAPHttpRequestResponsePair", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse ImportModSecurityLogFromFile(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("FilePath", filepath); + return api.callApi("importLogFiles", "action", "ImportModSecurityLogFromFile", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse PostModSecurityAuditEvent(String auditeventstring) throws ClientApiException { - Map map = new HashMap<>(); - if (auditeventstring != null) { - map.put("AuditEventString", auditeventstring); - } - return api.callApi("importLogFiles", "action", "PostModSecurityAuditEvent", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse ImportZAPHttpRequestResponsePair(String httprequest, String httpresponse) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("HTTPRequest", httprequest); + map.put("HTTPResponse", httpresponse); + return api.callApi("importLogFiles", "action", "ImportZAPHttpRequestResponsePair", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public byte[] OtherPostModSecurityAuditEvent(String auditeventstring) throws ClientApiException { - Map map = new HashMap<>(); - map.put("AuditEventString", auditeventstring); - return api.callApiOther("importLogFiles", "other", "OtherPostModSecurityAuditEvent", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse PostModSecurityAuditEvent(String auditeventstring) + throws ClientApiException { + Map map = new HashMap<>(); + if (auditeventstring != null) { + map.put("AuditEventString", auditeventstring); + } + return api.callApi("importLogFiles", "action", "PostModSecurityAuditEvent", map); + } + /** This component is optional and therefore the API will only work if it is installed */ + public byte[] OtherPostModSecurityAuditEvent(String auditeventstring) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("AuditEventString", auditeventstring); + return api.callApiOther("importLogFiles", "other", "OtherPostModSecurityAuditEvent", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java index 773582d..2ccf678 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -25,26 +25,20 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Importurls { - private final ClientApi api; - - public Importurls(ClientApi api) { - this.api = api; - } + private final ClientApi api; - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse importurls(String filepath) throws ClientApiException { - Map map = new HashMap<>(); - map.put("filePath", filepath); - return api.callApi("importurls", "action", "importurls", map); - } + public Importurls(ClientApi api) { + this.api = api; + } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse importurls(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("importurls", "action", "importurls", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index 5b5ce61..a6f529d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -25,42 +25,38 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Openapi { - private final ClientApi api; - - public Openapi(ClientApi api) { - this.api = api; - } - - /** - * Import an Open API definition from a local file. - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse importFile(String file) throws ClientApiException { - Map map = new HashMap<>(); - map.put("file", file); - return api.callApi("openapi", "action", "importFile", map); - } - - /** - * Import an Open API definition from a URL, hostOverride allows the host to be replaced - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse importUrl(String url, String hostoverride) throws ClientApiException { - Map map = new HashMap<>(); - map.put("url", url); - if (hostoverride != null) { - map.put("hostOverride", hostoverride); - } - return api.callApi("openapi", "action", "importUrl", map); - } - + private final ClientApi api; + + public Openapi(ClientApi api) { + this.api = api; + } + + /** + * Import an Open API definition from a local file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + return api.callApi("openapi", "action", "importFile", map); + } + + /** + * Import an Open API definition from a URL, hostOverride allows the host to be replaced + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url, String hostoverride) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + if (hostoverride != null) { + map.put("hostOverride", hostoverride); + } + return api.callApi("openapi", "action", "importUrl", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java index ada2df7..ceae677 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Params.java @@ -25,28 +25,24 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Params { - private final ClientApi api; - - public Params(ClientApi api) { - this.api = api; - } + private final ClientApi api; - /** - * Shows the parameters for the specified site, or for all sites if the site is not specified - */ - public ApiResponse params(String site) throws ClientApiException { - Map map = new HashMap<>(); - if (site != null) { - map.put("site", site); - } - return api.callApi("params", "view", "params", map); - } + public Params(ClientApi api) { + this.api = api; + } + /** + * Shows the parameters for the specified site, or for all sites if the site is not specified + */ + public ApiResponse params(String site) throws ClientApiException { + Map map = new HashMap<>(); + if (site != null) { + map.put("site", site); + } + return api.callApi("params", "view", "params", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java index e60d4a4..4fe10bb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pnh.java @@ -25,83 +25,63 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Pnh extends org.zaproxy.clientapi.gen.deprecated.PnhDeprecated { - private final ClientApi api; - - public Pnh(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse monitor(String id, String message) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("message", message); - return api.callApi("pnh", "action", "monitor", map); - } + public Pnh(ClientApi api) { + super(api); + this.api = api; + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse oracle(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("pnh", "action", "oracle", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse monitor(String id, String message) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("message", message); + return api.callApi("pnh", "action", "monitor", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse startMonitoring(String url) throws ClientApiException { - Map map = new HashMap<>(); - map.put("url", url); - return api.callApi("pnh", "action", "startMonitoring", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse oracle(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("pnh", "action", "oracle", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse stopMonitoring(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("pnh", "action", "stopMonitoring", map); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse startMonitoring(String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + return api.callApi("pnh", "action", "startMonitoring", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public byte[] pnh() throws ClientApiException { - return api.callApiOther("pnh", "other", "pnh", null); - } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse stopMonitoring(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("pnh", "action", "stopMonitoring", map); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public byte[] manifest() throws ClientApiException { - return api.callApiOther("pnh", "other", "manifest", null); - } + /** This component is optional and therefore the API will only work if it is installed */ + public byte[] pnh() throws ClientApiException { + return api.callApiOther("pnh", "other", "pnh", null); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public byte[] service() throws ClientApiException { - return api.callApiOther("pnh", "other", "service", null); - } + /** This component is optional and therefore the API will only work if it is installed */ + public byte[] manifest() throws ClientApiException { + return api.callApiOther("pnh", "other", "manifest", null); + } - /** - * This component is optional and therefore the API will only work if it is installed - */ - public byte[] fx_pnhxpi() throws ClientApiException { - return api.callApiOther("pnh", "other", "fx_pnh.xpi", null); - } + /** This component is optional and therefore the API will only work if it is installed */ + public byte[] service() throws ClientApiException { + return api.callApiOther("pnh", "other", "service", null); + } + /** This component is optional and therefore the API will only work if it is installed */ + public byte[] fx_pnhxpi() throws ClientApiException { + return api.callApiOther("pnh", "other", "fx_pnh.xpi", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index 36d53ed..af206dd 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -25,99 +25,86 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Pscan extends org.zaproxy.clientapi.gen.deprecated.PscanDeprecated { - private final ClientApi api; - - public Pscan(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Tells whether or not the passive scan should be performed only on messages that are in scope. - */ - public ApiResponse scanOnlyInScope() throws ClientApiException { - return api.callApi("pscan", "view", "scanOnlyInScope", null); - } - - /** - * The number of records the passive scanner still has to scan - */ - public ApiResponse recordsToScan() throws ClientApiException { - return api.callApi("pscan", "view", "recordsToScan", null); - } - - /** - * Lists all passive scanners with its ID, name, enabled state and alert threshold. - */ - public ApiResponse scanners() throws ClientApiException { - return api.callApi("pscan", "view", "scanners", null); - } - - /** - * Sets whether or not the passive scanning is enabled (Note: the enabled state is not persisted). - */ - public ApiResponse setEnabled(String enabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("enabled", enabled); - return api.callApi("pscan", "action", "setEnabled", map); - } - - /** - * Sets whether or not the passive scan should be performed only on messages that are in scope. - */ - public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiException { - Map map = new HashMap<>(); - map.put("onlyInScope", onlyinscope); - return api.callApi("pscan", "action", "setScanOnlyInScope", map); - } - - /** - * Enables all passive scanners - */ - public ApiResponse enableAllScanners() throws ClientApiException { - return api.callApi("pscan", "action", "enableAllScanners", null); - } - - /** - * Disables all passive scanners - */ - public ApiResponse disableAllScanners() throws ClientApiException { - return api.callApi("pscan", "action", "disableAllScanners", null); - } - - /** - * Enables all passive scanners with the given IDs (comma separated list of IDs) - */ - public ApiResponse enableScanners(String ids) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - return api.callApi("pscan", "action", "enableScanners", map); - } - - /** - * Disables all passive scanners with the given IDs (comma separated list of IDs) - */ - public ApiResponse disableScanners(String ids) throws ClientApiException { - Map map = new HashMap<>(); - map.put("ids", ids); - return api.callApi("pscan", "action", "disableScanners", map); - } - - /** - * Sets the alert threshold of the passive scanner with the given ID, accepted values for alert threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH - */ - public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - map.put("alertThreshold", alertthreshold); - return api.callApi("pscan", "action", "setScannerAlertThreshold", map); - } - + private final ClientApi api; + + public Pscan(ClientApi api) { + super(api); + this.api = api; + } + + /** + * Tells whether or not the passive scan should be performed only on messages that are in scope. + */ + public ApiResponse scanOnlyInScope() throws ClientApiException { + return api.callApi("pscan", "view", "scanOnlyInScope", null); + } + + /** The number of records the passive scanner still has to scan */ + public ApiResponse recordsToScan() throws ClientApiException { + return api.callApi("pscan", "view", "recordsToScan", null); + } + + /** Lists all passive scanners with its ID, name, enabled state and alert threshold. */ + public ApiResponse scanners() throws ClientApiException { + return api.callApi("pscan", "view", "scanners", null); + } + + /** + * Sets whether or not the passive scanning is enabled (Note: the enabled state is not + * persisted). + */ + public ApiResponse setEnabled(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("pscan", "action", "setEnabled", map); + } + + /** + * Sets whether or not the passive scan should be performed only on messages that are in scope. + */ + public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiException { + Map map = new HashMap<>(); + map.put("onlyInScope", onlyinscope); + return api.callApi("pscan", "action", "setScanOnlyInScope", map); + } + + /** Enables all passive scanners */ + public ApiResponse enableAllScanners() throws ClientApiException { + return api.callApi("pscan", "action", "enableAllScanners", null); + } + + /** Disables all passive scanners */ + public ApiResponse disableAllScanners() throws ClientApiException { + return api.callApi("pscan", "action", "disableAllScanners", null); + } + + /** Enables all passive scanners with the given IDs (comma separated list of IDs) */ + public ApiResponse enableScanners(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApi("pscan", "action", "enableScanners", map); + } + + /** Disables all passive scanners with the given IDs (comma separated list of IDs) */ + public ApiResponse disableScanners(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApi("pscan", "action", "disableScanners", map); + } + + /** + * Sets the alert threshold of the passive scanner with the given ID, accepted values for alert + * threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH + */ + public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("alertThreshold", alertthreshold); + return api.callApi("pscan", "action", "setScannerAlertThreshold", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 4c6f271..85fe38b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -25,68 +25,78 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Replacer { - private final ClientApi api; - - public Replacer(ClientApi api) { - this.api = api; - } + private final ClientApi api; - /** - * Returns full details of all of the rules - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse rules() throws ClientApiException { - return api.callApi("replacer", "view", "rules", null); - } + public Replacer(ClientApi api) { + this.api = api; + } - /** - * Adds a replacer rule. For the parameters: desc is a user friendly description, enabled is true or false, matchType is one of [REQ_HEADER, REQ_HEADER_STR, REQ_BODY_STR, RESP_HEADER, RESP_HEADER_STR, RESP_BODY_STR], matchRegex should be true if the matchString should be treated as a regex otherwise false, matchString is the string that will be matched against, replacement is the replacement string, initiators may be blank (for all initiators) or a comma separated list of integers as defined in HttpSender - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse addRule(String description, String enabled, String matchtype, String matchregex, String matchstring, String replacement, String initiators) throws ClientApiException { - Map map = new HashMap<>(); - map.put("description", description); - map.put("enabled", enabled); - map.put("matchType", matchtype); - map.put("matchRegex", matchregex); - map.put("matchString", matchstring); - map.put("replacement", replacement); - if (initiators != null) { - map.put("initiators", initiators); - } - return api.callApi("replacer", "action", "addRule", map); - } + /** + * Returns full details of all of the rules + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse rules() throws ClientApiException { + return api.callApi("replacer", "view", "rules", null); + } - /** - * Removes the rule with the given description - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse removeRule(String description) throws ClientApiException { - Map map = new HashMap<>(); - map.put("description", description); - return api.callApi("replacer", "action", "removeRule", map); - } + /** + * Adds a replacer rule. For the parameters: desc is a user friendly description, enabled is + * true or false, matchType is one of [REQ_HEADER, REQ_HEADER_STR, REQ_BODY_STR, RESP_HEADER, + * RESP_HEADER_STR, RESP_BODY_STR], matchRegex should be true if the matchString should be + * treated as a regex otherwise false, matchString is the string that will be matched against, + * replacement is the replacement string, initiators may be blank (for all initiators) or a + * comma separated list of integers as defined in HttpSender + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addRule( + String description, + String enabled, + String matchtype, + String matchregex, + String matchstring, + String replacement, + String initiators) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("enabled", enabled); + map.put("matchType", matchtype); + map.put("matchRegex", matchregex); + map.put("matchString", matchstring); + map.put("replacement", replacement); + if (initiators != null) { + map.put("initiators", initiators); + } + return api.callApi("replacer", "action", "addRule", map); + } - /** - * Enables or disables the rule with the given description based on the bool parameter - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setEnabled(String description, String bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("description", description); - map.put("bool", bool); - return api.callApi("replacer", "action", "setEnabled", map); - } + /** + * Removes the rule with the given description + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeRule(String description) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + return api.callApi("replacer", "action", "removeRule", map); + } + /** + * Enables or disables the rule with the given description based on the bool parameter + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setEnabled(String description, String bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("bool", bool); + return api.callApi("replacer", "action", "setEnabled", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java index 80f545b..45dc7df 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reveal.java @@ -25,38 +25,34 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Reveal extends org.zaproxy.clientapi.gen.deprecated.RevealDeprecated { - private final ClientApi api; - - public Reveal(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Tells if shows hidden fields and enables disabled fields - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse reveal() throws ClientApiException { - return api.callApi("reveal", "view", "reveal", null); - } - - /** - * Sets if shows hidden fields and enables disabled fields - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setReveal(String reveal) throws ClientApiException { - Map map = new HashMap<>(); - map.put("reveal", reveal); - return api.callApi("reveal", "action", "setReveal", map); - } - + private final ClientApi api; + + public Reveal(ClientApi api) { + super(api); + this.api = api; + } + + /** + * Tells if shows hidden fields and enables disabled fields + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse reveal() throws ClientApiException { + return api.callApi("reveal", "view", "reveal", null); + } + + /** + * Sets if shows hidden fields and enables disabled fields + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setReveal(String reveal) throws ClientApiException { + Map map = new HashMap<>(); + map.put("reveal", reveal); + return api.callApi("reveal", "action", "setReveal", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 81ac487..5b95124 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -26,86 +26,79 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Script extends org.zaproxy.clientapi.gen.deprecated.ScriptDeprecated { - private final ClientApi api; - - public Script(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - /** - * Lists the script engines available - */ - public ApiResponse listEngines() throws ClientApiException { - return api.callApi("script", "view", "listEngines", null); - } + public Script(ClientApi api) { + super(api); + this.api = api; + } - /** - * Lists the scripts available, with its engine, name, description, type and error state. - */ - public ApiResponse listScripts() throws ClientApiException { - return api.callApi("script", "view", "listScripts", null); - } + /** Lists the script engines available */ + public ApiResponse listEngines() throws ClientApiException { + return api.callApi("script", "view", "listEngines", null); + } - /** - * Enables the script with the given name - */ - public ApiResponse enable(String scriptname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scriptName", scriptname); - return api.callApi("script", "action", "enable", map); - } + /** Lists the scripts available, with its engine, name, description, type and error state. */ + public ApiResponse listScripts() throws ClientApiException { + return api.callApi("script", "view", "listScripts", null); + } - /** - * Disables the script with the given name - */ - public ApiResponse disable(String scriptname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scriptName", scriptname); - return api.callApi("script", "action", "disable", map); - } + /** Enables the script with the given name */ + public ApiResponse enable(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "action", "enable", map); + } - /** - * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description, and a charset name to read the script (the charset name is required if the script is not in UTF-8, for example, in ISO-8859-1). - */ - public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription, Charset charset) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scriptName", scriptname); - map.put("scriptType", scripttype); - map.put("scriptEngine", scriptengine); - map.put("fileName", filename); - if (scriptdescription != null) { - map.put("scriptDescription", scriptdescription); - } - if (charset != null) { - map.put("charset", charset.name()); - } - return api.callApi("script", "action", "load", map); - } + /** Disables the script with the given name */ + public ApiResponse disable(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "action", "disable", map); + } - /** - * Removes the script with the given name - */ - public ApiResponse remove(String scriptname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scriptName", scriptname); - return api.callApi("script", "action", "remove", map); - } + /** + * Loads a script into ZAP from the given local file, with the given name, type and engine, + * optionally with a description, and a charset name to read the script (the charset name is + * required if the script is not in UTF-8, for example, in ISO-8859-1). + */ + public ApiResponse load( + String scriptname, + String scripttype, + String scriptengine, + String filename, + String scriptdescription, + Charset charset) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("scriptType", scripttype); + map.put("scriptEngine", scriptengine); + map.put("fileName", filename); + if (scriptdescription != null) { + map.put("scriptDescription", scriptdescription); + } + if (charset != null) { + map.put("charset", charset.name()); + } + return api.callApi("script", "action", "load", map); + } - /** - * Runs the stand alone script with the give name - */ - public ApiResponse runStandAloneScript(String scriptname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scriptName", scriptname); - return api.callApi("script", "action", "runStandAloneScript", map); - } + /** Removes the script with the given name */ + public ApiResponse remove(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "action", "remove", map); + } + /** Runs the stand alone script with the give name */ + public ApiResponse runStandAloneScript(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "action", "runStandAloneScript", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index 702821a..48b74c0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -25,198 +25,206 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Search extends org.zaproxy.clientapi.gen.deprecated.SearchDeprecated { - private final ClientApi api; - - public Search(ClientApi api) { - super(api); - this.api = api; - } - - public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "urlsByUrlRegex", map); - } - - public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "urlsByRequestRegex", map); - } - - public ApiResponse urlsByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "urlsByResponseRegex", map); - } - - public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "urlsByHeaderRegex", map); - } - - public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "messagesByUrlRegex", map); - } - - public ApiResponse messagesByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "messagesByRequestRegex", map); - } - - public ApiResponse messagesByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "messagesByResponseRegex", map); - } - - public ApiResponse messagesByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApi("search", "view", "messagesByHeaderRegex", map); - } - - public byte[] harByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApiOther("search", "other", "harByUrlRegex", map); - } - - public byte[] harByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApiOther("search", "other", "harByRequestRegex", map); - } - - public byte[] harByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApiOther("search", "other", "harByResponseRegex", map); - } - - public byte[] harByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - return api.callApiOther("search", "other", "harByHeaderRegex", map); - } - + private final ClientApi api; + + public Search(ClientApi api) { + super(api); + this.api = api; + } + + public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByUrlRegex", map); + } + + public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByRequestRegex", map); + } + + public ApiResponse urlsByResponseRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByResponseRegex", map); + } + + public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByHeaderRegex", map); + } + + public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByUrlRegex", map); + } + + public ApiResponse messagesByRequestRegex( + String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByRequestRegex", map); + } + + public ApiResponse messagesByResponseRegex( + String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByResponseRegex", map); + } + + public ApiResponse messagesByHeaderRegex( + String regex, String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByHeaderRegex", map); + } + + public byte[] harByUrlRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByUrlRegex", map); + } + + public byte[] harByRequestRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByRequestRegex", map); + } + + public byte[] harByResponseRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByResponseRegex", map); + } + + public byte[] harByHeaderRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByHeaderRegex", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index c0bb6e3..d473e02 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -25,118 +25,114 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Selenium extends org.zaproxy.clientapi.gen.deprecated.SeleniumDeprecated { - private final ClientApi api; - - public Selenium(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Returns the current path to ChromeDriver - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionChromeDriverPath() throws ClientApiException { - return api.callApi("selenium", "view", "optionChromeDriverPath", null); - } - - /** - * Returns the current path to Firefox binary - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionFirefoxBinaryPath() throws ClientApiException { - return api.callApi("selenium", "view", "optionFirefoxBinaryPath", null); - } - - /** - * Returns the current path to Firefox driver (geckodriver) - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionFirefoxDriverPath() throws ClientApiException { - return api.callApi("selenium", "view", "optionFirefoxDriverPath", null); - } - - /** - * Returns the current path to IEDriverServer - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionIeDriverPath() throws ClientApiException { - return api.callApi("selenium", "view", "optionIeDriverPath", null); - } - - /** - * Returns the current path to PhantomJS binary - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { - return api.callApi("selenium", "view", "optionPhantomJsBinaryPath", null); - } - - /** - * Sets the current path to ChromeDriver - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionChromeDriverPath(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("selenium", "action", "setOptionChromeDriverPath", map); - } - - /** - * Sets the current path to Firefox binary - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionFirefoxBinaryPath(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("selenium", "action", "setOptionFirefoxBinaryPath", map); - } - - /** - * Sets the current path to Firefox driver (geckodriver) - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionFirefoxDriverPath(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); - } - - /** - * Sets the current path to IEDriverServer - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionIeDriverPath(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("selenium", "action", "setOptionIeDriverPath", map); - } - - /** - * Sets the current path to PhantomJS binary - *

- * This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse setOptionPhantomJsBinaryPath(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); - } - + private final ClientApi api; + + public Selenium(ClientApi api) { + super(api); + this.api = api; + } + + /** + * Returns the current path to ChromeDriver + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionChromeDriverPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionChromeDriverPath", null); + } + + /** + * Returns the current path to Firefox binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionFirefoxBinaryPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionFirefoxBinaryPath", null); + } + + /** + * Returns the current path to Firefox driver (geckodriver) + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionFirefoxDriverPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionFirefoxDriverPath", null); + } + + /** + * Returns the current path to IEDriverServer + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionIeDriverPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionIeDriverPath", null); + } + + /** + * Returns the current path to PhantomJS binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionPhantomJsBinaryPath", null); + } + + /** + * Sets the current path to ChromeDriver + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionChromeDriverPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionChromeDriverPath", map); + } + + /** + * Sets the current path to Firefox binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionFirefoxBinaryPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxBinaryPath", map); + } + + /** + * Sets the current path to Firefox driver (geckodriver) + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionFirefoxDriverPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); + } + + /** + * Sets the current path to IEDriverServer + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionIeDriverPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionIeDriverPath", map); + } + + /** + * Sets the current path to PhantomJS binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionPhantomJsBinaryPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java index 1e3bbdb..6bf87fb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java @@ -25,44 +25,46 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") -public class SessionManagement extends org.zaproxy.clientapi.gen.deprecated.SessionManagementDeprecated { - - private final ClientApi api; +public class SessionManagement + extends org.zaproxy.clientapi.gen.deprecated.SessionManagementDeprecated { - public SessionManagement(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - public ApiResponse getSupportedSessionManagementMethods() throws ClientApiException { - return api.callApi("sessionManagement", "view", "getSupportedSessionManagementMethods", null); - } + public SessionManagement(ClientApi api) { + super(api); + this.api = api; + } - public ApiResponse getSessionManagementMethodConfigParams(String methodname) throws ClientApiException { - Map map = new HashMap<>(); - map.put("methodName", methodname); - return api.callApi("sessionManagement", "view", "getSessionManagementMethodConfigParams", map); - } + public ApiResponse getSupportedSessionManagementMethods() throws ClientApiException { + return api.callApi( + "sessionManagement", "view", "getSupportedSessionManagementMethods", null); + } - public ApiResponse getSessionManagementMethod(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("sessionManagement", "view", "getSessionManagementMethod", map); - } + public ApiResponse getSessionManagementMethodConfigParams(String methodname) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("methodName", methodname); + return api.callApi( + "sessionManagement", "view", "getSessionManagementMethodConfigParams", map); + } - public ApiResponse setSessionManagementMethod(String contextid, String methodname, String methodconfigparams) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("methodName", methodname); - if (methodconfigparams != null) { - map.put("methodConfigParams", methodconfigparams); - } - return api.callApi("sessionManagement", "action", "setSessionManagementMethod", map); - } + public ApiResponse getSessionManagementMethod(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("sessionManagement", "view", "getSessionManagementMethod", map); + } + public ApiResponse setSessionManagementMethod( + String contextid, String methodname, String methodconfigparams) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("methodName", methodname); + if (methodconfigparams != null) { + map.put("methodConfigParams", methodconfigparams); + } + return api.callApi("sessionManagement", "action", "setSessionManagementMethod", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 7b1f5ac..f20488b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -25,508 +25,506 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Spider extends org.zaproxy.clientapi.gen.deprecated.SpiderDeprecated { - private final ClientApi api; - - public Spider(ClientApi api) { - super(api); - this.api = api; - } - - public ApiResponse status(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("spider", "view", "status", map); - } - - public ApiResponse results(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("spider", "view", "results", map); - } - - public ApiResponse fullResults(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("spider", "view", "fullResults", map); - } - - public ApiResponse scans() throws ClientApiException { - return api.callApi("spider", "view", "scans", null); - } - - /** - * Gets the regexes of URLs excluded from the spider scans. - */ - public ApiResponse excludedFromScan() throws ClientApiException { - return api.callApi("spider", "view", "excludedFromScan", null); - } - - /** - * Returns a list of unique URLs from the history table based on HTTP messages added by the Spider. - */ - public ApiResponse allUrls() throws ClientApiException { - return api.callApi("spider", "view", "allUrls", null); - } - - /** - * Returns a list of the names of the nodes added to the Sites tree by the specified scan. - */ - public ApiResponse addedNodes(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("spider", "view", "addedNodes", map); - } - - /** - * Gets all the domains that are always in scope. For each domain the following are shown: the index, the value (domain), if enabled, and if specified as a regex. - */ - public ApiResponse domainsAlwaysInScope() throws ClientApiException { - return api.callApi("spider", "view", "domainsAlwaysInScope", null); - } - - /** - * Use view domainsAlwaysInScope instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionDomainsAlwaysInScope() throws ClientApiException { - return api.callApi("spider", "view", "optionDomainsAlwaysInScope", null); - } - - /** - * Use view domainsAlwaysInScope instead. - * @deprecated - */ - @Deprecated - public ApiResponse optionDomainsAlwaysInScopeEnabled() throws ClientApiException { - return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", null); - } - - public ApiResponse optionHandleParameters() throws ClientApiException { - return api.callApi("spider", "view", "optionHandleParameters", null); - } - - /** - * Gets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. - */ - public ApiResponse optionMaxChildren() throws ClientApiException { - return api.callApi("spider", "view", "optionMaxChildren", null); - } - - public ApiResponse optionMaxDepth() throws ClientApiException { - return api.callApi("spider", "view", "optionMaxDepth", null); - } - - public ApiResponse optionMaxDuration() throws ClientApiException { - return api.callApi("spider", "view", "optionMaxDuration", null); - } - - /** - * Gets the maximum size, in bytes, that a response might have to be parsed. - */ - public ApiResponse optionMaxParseSizeBytes() throws ClientApiException { - return api.callApi("spider", "view", "optionMaxParseSizeBytes", null); - } - - public ApiResponse optionMaxScansInUI() throws ClientApiException { - return api.callApi("spider", "view", "optionMaxScansInUI", null); - } - - public ApiResponse optionRequestWaitTime() throws ClientApiException { - return api.callApi("spider", "view", "optionRequestWaitTime", null); - } - - @Deprecated - public ApiResponse optionScope() throws ClientApiException { - return api.callApi("spider", "view", "optionScope", null); - } - - @Deprecated - public ApiResponse optionScopeText() throws ClientApiException { - return api.callApi("spider", "view", "optionScopeText", null); - } - - public ApiResponse optionSkipURLString() throws ClientApiException { - return api.callApi("spider", "view", "optionSkipURLString", null); - } - - public ApiResponse optionThreadCount() throws ClientApiException { - return api.callApi("spider", "view", "optionThreadCount", null); - } - - public ApiResponse optionUserAgent() throws ClientApiException { - return api.callApi("spider", "view", "optionUserAgent", null); - } - - /** - * Gets whether or not a spider process should accept cookies while spidering. - */ - public ApiResponse optionAcceptCookies() throws ClientApiException { - return api.callApi("spider", "view", "optionAcceptCookies", null); - } - - public ApiResponse optionHandleODataParametersVisited() throws ClientApiException { - return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); - } - - public ApiResponse optionParseComments() throws ClientApiException { - return api.callApi("spider", "view", "optionParseComments", null); - } - - public ApiResponse optionParseGit() throws ClientApiException { - return api.callApi("spider", "view", "optionParseGit", null); - } - - public ApiResponse optionParseRobotsTxt() throws ClientApiException { - return api.callApi("spider", "view", "optionParseRobotsTxt", null); - } - - public ApiResponse optionParseSVNEntries() throws ClientApiException { - return api.callApi("spider", "view", "optionParseSVNEntries", null); - } - - public ApiResponse optionParseSitemapXml() throws ClientApiException { - return api.callApi("spider", "view", "optionParseSitemapXml", null); - } - - public ApiResponse optionPostForm() throws ClientApiException { - return api.callApi("spider", "view", "optionPostForm", null); - } - - public ApiResponse optionProcessForm() throws ClientApiException { - return api.callApi("spider", "view", "optionProcessForm", null); - } - - /** - * Gets whether or not the 'Referer' header should be sent while spidering. - */ - public ApiResponse optionSendRefererHeader() throws ClientApiException { - return api.callApi("spider", "view", "optionSendRefererHeader", null); - } - - public ApiResponse optionShowAdvancedDialog() throws ClientApiException { - return api.callApi("spider", "view", "optionShowAdvancedDialog", null); - } - - /** - * Runs the spider against the given URL (or context). Optionally, the 'maxChildren' parameter can be set to limit the number of children scanned, the 'recurse' parameter can be used to prevent the spider from seeding recursively, the parameter 'contextName' can be used to constrain the scan to a Context and the parameter 'subtreeOnly' allows to restrict the spider under a site's subtree (using the specified 'url'). - */ - public ApiResponse scan(String url, String maxchildren, String recurse, String contextname, String subtreeonly) throws ClientApiException { - Map map = new HashMap<>(); - if (url != null) { - map.put("url", url); - } - if (maxchildren != null) { - map.put("maxChildren", maxchildren); - } - if (recurse != null) { - map.put("recurse", recurse); - } - if (contextname != null) { - map.put("contextName", contextname); - } - if (subtreeonly != null) { - map.put("subtreeOnly", subtreeonly); - } - return api.callApi("spider", "action", "scan", map); - } - - /** - * Runs the spider from the perspective of a User, obtained using the given Context ID and User ID. See 'scan' action for more details. - */ - public ApiResponse scanAsUser(String contextid, String userid, String url, String maxchildren, String recurse, String subtreeonly) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - if (url != null) { - map.put("url", url); - } - if (maxchildren != null) { - map.put("maxChildren", maxchildren); - } - if (recurse != null) { - map.put("recurse", recurse); - } - if (subtreeonly != null) { - map.put("subtreeOnly", subtreeonly); - } - return api.callApi("spider", "action", "scanAsUser", map); - } - - public ApiResponse pause(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("spider", "action", "pause", map); - } - - public ApiResponse resume(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("spider", "action", "resume", map); - } - - public ApiResponse stop(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - if (scanid != null) { - map.put("scanId", scanid); - } - return api.callApi("spider", "action", "stop", map); - } - - public ApiResponse removeScan(String scanid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("scanId", scanid); - return api.callApi("spider", "action", "removeScan", map); - } - - public ApiResponse pauseAllScans() throws ClientApiException { - return api.callApi("spider", "action", "pauseAllScans", null); - } - - public ApiResponse resumeAllScans() throws ClientApiException { - return api.callApi("spider", "action", "resumeAllScans", null); - } - - public ApiResponse stopAllScans() throws ClientApiException { - return api.callApi("spider", "action", "stopAllScans", null); - } - - public ApiResponse removeAllScans() throws ClientApiException { - return api.callApi("spider", "action", "removeAllScans", null); - } - - /** - * Clears the regexes of URLs excluded from the spider scans. - */ - public ApiResponse clearExcludedFromScan() throws ClientApiException { - return api.callApi("spider", "action", "clearExcludedFromScan", null); - } - - /** - * Adds a regex of URLs that should be excluded from the spider scans. - */ - public ApiResponse excludeFromScan(String regex) throws ClientApiException { - Map map = new HashMap<>(); - map.put("regex", regex); - return api.callApi("spider", "action", "excludeFromScan", map); - } - - /** - * Adds a new domain that's always in scope, using the specified value. Optionally sets if the new entry is enabled (default, true) and whether or not the new value is specified as a regex (default, false). - */ - public ApiResponse addDomainAlwaysInScope(String value, String isregex, String isenabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("value", value); - if (isregex != null) { - map.put("isRegex", isregex); - } - if (isenabled != null) { - map.put("isEnabled", isenabled); - } - return api.callApi("spider", "action", "addDomainAlwaysInScope", map); - } - - /** - * Modifies a domain that's always in scope. Allows to modify the value, if enabled or if a regex. The domain is selected with its index, which can be obtained with the view domainsAlwaysInScope. - */ - public ApiResponse modifyDomainAlwaysInScope(String idx, String value, String isregex, String isenabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - if (value != null) { - map.put("value", value); - } - if (isregex != null) { - map.put("isRegex", isregex); - } - if (isenabled != null) { - map.put("isEnabled", isenabled); - } - return api.callApi("spider", "action", "modifyDomainAlwaysInScope", map); - } - - /** - * Removes a domain that's always in scope, with the given index. The index can be obtained with the view domainsAlwaysInScope. - */ - public ApiResponse removeDomainAlwaysInScope(String idx) throws ClientApiException { - Map map = new HashMap<>(); - map.put("idx", idx); - return api.callApi("spider", "action", "removeDomainAlwaysInScope", map); - } - - /** - * Enables all domains that are always in scope. - */ - public ApiResponse enableAllDomainsAlwaysInScope() throws ClientApiException { - return api.callApi("spider", "action", "enableAllDomainsAlwaysInScope", null); - } - - /** - * Disables all domains that are always in scope. - */ - public ApiResponse disableAllDomainsAlwaysInScope() throws ClientApiException { - return api.callApi("spider", "action", "disableAllDomainsAlwaysInScope", null); - } - - public ApiResponse setOptionHandleParameters(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("spider", "action", "setOptionHandleParameters", map); - } - - /** - * Use actions [add|modify|remove]DomainAlwaysInScope instead. - * @deprecated - */ - @Deprecated - public ApiResponse setOptionScopeString(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("spider", "action", "setOptionScopeString", map); - } - - public ApiResponse setOptionSkipURLString(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("spider", "action", "setOptionSkipURLString", map); - } - - public ApiResponse setOptionUserAgent(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("spider", "action", "setOptionUserAgent", map); - } - - /** - * Sets whether or not a spider process should accept cookies while spidering. - */ - public ApiResponse setOptionAcceptCookies(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionAcceptCookies", map); - } - - public ApiResponse setOptionHandleODataParametersVisited(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); - } - - /** - * Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. - */ - public ApiResponse setOptionMaxChildren(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionMaxChildren", map); - } - - public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionMaxDepth", map); - } - - public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionMaxDuration", map); - } - - /** - * Sets the maximum size, in bytes, that a response might have to be parsed. This allows the spider to skip big responses/files. - */ - public ApiResponse setOptionMaxParseSizeBytes(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionMaxParseSizeBytes", map); - } - - public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionMaxScansInUI", map); - } - - public ApiResponse setOptionParseComments(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionParseComments", map); - } - - public ApiResponse setOptionParseGit(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionParseGit", map); - } - - public ApiResponse setOptionParseRobotsTxt(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionParseRobotsTxt", map); - } - - public ApiResponse setOptionParseSVNEntries(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionParseSVNEntries", map); - } - - public ApiResponse setOptionParseSitemapXml(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionParseSitemapXml", map); - } - - public ApiResponse setOptionPostForm(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionPostForm", map); - } - - public ApiResponse setOptionProcessForm(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionProcessForm", map); - } - - public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionRequestWaitTime", map); - } - - /** - * Sets whether or not the 'Referer' header should be sent while spidering. - */ - public ApiResponse setOptionSendRefererHeader(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionSendRefererHeader", map); - } - - public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("spider", "action", "setOptionShowAdvancedDialog", map); - } - - public ApiResponse setOptionThreadCount(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("spider", "action", "setOptionThreadCount", map); - } - + private final ClientApi api; + + public Spider(ClientApi api) { + super(api); + this.api = api; + } + + public ApiResponse status(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "view", "status", map); + } + + public ApiResponse results(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "view", "results", map); + } + + public ApiResponse fullResults(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("spider", "view", "fullResults", map); + } + + public ApiResponse scans() throws ClientApiException { + return api.callApi("spider", "view", "scans", null); + } + + /** Gets the regexes of URLs excluded from the spider scans. */ + public ApiResponse excludedFromScan() throws ClientApiException { + return api.callApi("spider", "view", "excludedFromScan", null); + } + + /** + * Returns a list of unique URLs from the history table based on HTTP messages added by the + * Spider. + */ + public ApiResponse allUrls() throws ClientApiException { + return api.callApi("spider", "view", "allUrls", null); + } + + /** Returns a list of the names of the nodes added to the Sites tree by the specified scan. */ + public ApiResponse addedNodes(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "view", "addedNodes", map); + } + + /** + * Gets all the domains that are always in scope. For each domain the following are shown: the + * index, the value (domain), if enabled, and if specified as a regex. + */ + public ApiResponse domainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "view", "domainsAlwaysInScope", null); + } + + /** + * Use view domainsAlwaysInScope instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionDomainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "view", "optionDomainsAlwaysInScope", null); + } + + /** + * Use view domainsAlwaysInScope instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse optionDomainsAlwaysInScopeEnabled() throws ClientApiException { + return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", null); + } + + public ApiResponse optionHandleParameters() throws ClientApiException { + return api.callApi("spider", "view", "optionHandleParameters", null); + } + + /** Gets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. */ + public ApiResponse optionMaxChildren() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxChildren", null); + } + + public ApiResponse optionMaxDepth() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxDepth", null); + } + + public ApiResponse optionMaxDuration() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxDuration", null); + } + + /** Gets the maximum size, in bytes, that a response might have to be parsed. */ + public ApiResponse optionMaxParseSizeBytes() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxParseSizeBytes", null); + } + + public ApiResponse optionMaxScansInUI() throws ClientApiException { + return api.callApi("spider", "view", "optionMaxScansInUI", null); + } + + public ApiResponse optionRequestWaitTime() throws ClientApiException { + return api.callApi("spider", "view", "optionRequestWaitTime", null); + } + + @Deprecated + public ApiResponse optionScope() throws ClientApiException { + return api.callApi("spider", "view", "optionScope", null); + } + + @Deprecated + public ApiResponse optionScopeText() throws ClientApiException { + return api.callApi("spider", "view", "optionScopeText", null); + } + + public ApiResponse optionSkipURLString() throws ClientApiException { + return api.callApi("spider", "view", "optionSkipURLString", null); + } + + public ApiResponse optionThreadCount() throws ClientApiException { + return api.callApi("spider", "view", "optionThreadCount", null); + } + + public ApiResponse optionUserAgent() throws ClientApiException { + return api.callApi("spider", "view", "optionUserAgent", null); + } + + /** Gets whether or not a spider process should accept cookies while spidering. */ + public ApiResponse optionAcceptCookies() throws ClientApiException { + return api.callApi("spider", "view", "optionAcceptCookies", null); + } + + public ApiResponse optionHandleODataParametersVisited() throws ClientApiException { + return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); + } + + public ApiResponse optionParseComments() throws ClientApiException { + return api.callApi("spider", "view", "optionParseComments", null); + } + + public ApiResponse optionParseGit() throws ClientApiException { + return api.callApi("spider", "view", "optionParseGit", null); + } + + public ApiResponse optionParseRobotsTxt() throws ClientApiException { + return api.callApi("spider", "view", "optionParseRobotsTxt", null); + } + + public ApiResponse optionParseSVNEntries() throws ClientApiException { + return api.callApi("spider", "view", "optionParseSVNEntries", null); + } + + public ApiResponse optionParseSitemapXml() throws ClientApiException { + return api.callApi("spider", "view", "optionParseSitemapXml", null); + } + + public ApiResponse optionPostForm() throws ClientApiException { + return api.callApi("spider", "view", "optionPostForm", null); + } + + public ApiResponse optionProcessForm() throws ClientApiException { + return api.callApi("spider", "view", "optionProcessForm", null); + } + + /** Gets whether or not the 'Referer' header should be sent while spidering. */ + public ApiResponse optionSendRefererHeader() throws ClientApiException { + return api.callApi("spider", "view", "optionSendRefererHeader", null); + } + + public ApiResponse optionShowAdvancedDialog() throws ClientApiException { + return api.callApi("spider", "view", "optionShowAdvancedDialog", null); + } + + /** + * Runs the spider against the given URL (or context). Optionally, the 'maxChildren' parameter + * can be set to limit the number of children scanned, the 'recurse' parameter can be used to + * prevent the spider from seeding recursively, the parameter 'contextName' can be used to + * constrain the scan to a Context and the parameter 'subtreeOnly' allows to restrict the spider + * under a site's subtree (using the specified 'url'). + */ + public ApiResponse scan( + String url, String maxchildren, String recurse, String contextname, String subtreeonly) + throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (maxchildren != null) { + map.put("maxChildren", maxchildren); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (contextname != null) { + map.put("contextName", contextname); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("spider", "action", "scan", map); + } + + /** + * Runs the spider from the perspective of a User, obtained using the given Context ID and User + * ID. See 'scan' action for more details. + */ + public ApiResponse scanAsUser( + String contextid, + String userid, + String url, + String maxchildren, + String recurse, + String subtreeonly) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + if (url != null) { + map.put("url", url); + } + if (maxchildren != null) { + map.put("maxChildren", maxchildren); + } + if (recurse != null) { + map.put("recurse", recurse); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + return api.callApi("spider", "action", "scanAsUser", map); + } + + public ApiResponse pause(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("spider", "action", "pause", map); + } + + public ApiResponse resume(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("spider", "action", "resume", map); + } + + public ApiResponse stop(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + if (scanid != null) { + map.put("scanId", scanid); + } + return api.callApi("spider", "action", "stop", map); + } + + public ApiResponse removeScan(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("spider", "action", "removeScan", map); + } + + public ApiResponse pauseAllScans() throws ClientApiException { + return api.callApi("spider", "action", "pauseAllScans", null); + } + + public ApiResponse resumeAllScans() throws ClientApiException { + return api.callApi("spider", "action", "resumeAllScans", null); + } + + public ApiResponse stopAllScans() throws ClientApiException { + return api.callApi("spider", "action", "stopAllScans", null); + } + + public ApiResponse removeAllScans() throws ClientApiException { + return api.callApi("spider", "action", "removeAllScans", null); + } + + /** Clears the regexes of URLs excluded from the spider scans. */ + public ApiResponse clearExcludedFromScan() throws ClientApiException { + return api.callApi("spider", "action", "clearExcludedFromScan", null); + } + + /** Adds a regex of URLs that should be excluded from the spider scans. */ + public ApiResponse excludeFromScan(String regex) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + return api.callApi("spider", "action", "excludeFromScan", map); + } + + /** + * Adds a new domain that's always in scope, using the specified value. Optionally sets if the + * new entry is enabled (default, true) and whether or not the new value is specified as a regex + * (default, false). + */ + public ApiResponse addDomainAlwaysInScope(String value, String isregex, String isenabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("value", value); + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("spider", "action", "addDomainAlwaysInScope", map); + } + + /** + * Modifies a domain that's always in scope. Allows to modify the value, if enabled or if a + * regex. The domain is selected with its index, which can be obtained with the view + * domainsAlwaysInScope. + */ + public ApiResponse modifyDomainAlwaysInScope( + String idx, String value, String isregex, String isenabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + if (value != null) { + map.put("value", value); + } + if (isregex != null) { + map.put("isRegex", isregex); + } + if (isenabled != null) { + map.put("isEnabled", isenabled); + } + return api.callApi("spider", "action", "modifyDomainAlwaysInScope", map); + } + + /** + * Removes a domain that's always in scope, with the given index. The index can be obtained with + * the view domainsAlwaysInScope. + */ + public ApiResponse removeDomainAlwaysInScope(String idx) throws ClientApiException { + Map map = new HashMap<>(); + map.put("idx", idx); + return api.callApi("spider", "action", "removeDomainAlwaysInScope", map); + } + + /** Enables all domains that are always in scope. */ + public ApiResponse enableAllDomainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "action", "enableAllDomainsAlwaysInScope", null); + } + + /** Disables all domains that are always in scope. */ + public ApiResponse disableAllDomainsAlwaysInScope() throws ClientApiException { + return api.callApi("spider", "action", "disableAllDomainsAlwaysInScope", null); + } + + public ApiResponse setOptionHandleParameters(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("spider", "action", "setOptionHandleParameters", map); + } + + /** + * Use actions [add|modify|remove]DomainAlwaysInScope instead. + * + * @deprecated + */ + @Deprecated + public ApiResponse setOptionScopeString(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("spider", "action", "setOptionScopeString", map); + } + + public ApiResponse setOptionSkipURLString(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("spider", "action", "setOptionSkipURLString", map); + } + + public ApiResponse setOptionUserAgent(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("spider", "action", "setOptionUserAgent", map); + } + + /** Sets whether or not a spider process should accept cookies while spidering. */ + public ApiResponse setOptionAcceptCookies(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionAcceptCookies", map); + } + + public ApiResponse setOptionHandleODataParametersVisited(boolean bool) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); + } + + /** Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. */ + public ApiResponse setOptionMaxChildren(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxChildren", map); + } + + public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxDepth", map); + } + + public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxDuration", map); + } + + /** + * Sets the maximum size, in bytes, that a response might have to be parsed. This allows the + * spider to skip big responses/files. + */ + public ApiResponse setOptionMaxParseSizeBytes(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxParseSizeBytes", map); + } + + public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionMaxScansInUI", map); + } + + public ApiResponse setOptionParseComments(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseComments", map); + } + + public ApiResponse setOptionParseGit(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseGit", map); + } + + public ApiResponse setOptionParseRobotsTxt(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseRobotsTxt", map); + } + + public ApiResponse setOptionParseSVNEntries(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseSVNEntries", map); + } + + public ApiResponse setOptionParseSitemapXml(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseSitemapXml", map); + } + + public ApiResponse setOptionPostForm(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionPostForm", map); + } + + public ApiResponse setOptionProcessForm(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionProcessForm", map); + } + + public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionRequestWaitTime", map); + } + + /** Sets whether or not the 'Referer' header should be sent while spidering. */ + public ApiResponse setOptionSendRefererHeader(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionSendRefererHeader", map); + } + + public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionShowAdvancedDialog", map); + } + + public ApiResponse setOptionThreadCount(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("spider", "action", "setOptionThreadCount", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java index 50aae4c..ed493f8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Stats.java @@ -25,134 +25,106 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Stats extends org.zaproxy.clientapi.gen.deprecated.StatsDeprecated { - private final ClientApi api; - - public Stats(ClientApi api) { - super(api); - this.api = api; - } - - /** - * Statistics - */ - public ApiResponse stats(String keyprefix) throws ClientApiException { - Map map = new HashMap<>(); - if (keyprefix != null) { - map.put("keyPrefix", keyprefix); - } - return api.callApi("stats", "view", "stats", map); - } - - /** - * Gets all of the site based statistics, optionally filtered by a key prefix - */ - public ApiResponse allSitesStats(String keyprefix) throws ClientApiException { - Map map = new HashMap<>(); - if (keyprefix != null) { - map.put("keyPrefix", keyprefix); - } - return api.callApi("stats", "view", "allSitesStats", map); - } - - /** - * Gets all of the global statistics, optionally filtered by a key prefix - */ - public ApiResponse siteStats(String site, String keyprefix) throws ClientApiException { - Map map = new HashMap<>(); - map.put("site", site); - if (keyprefix != null) { - map.put("keyPrefix", keyprefix); - } - return api.callApi("stats", "view", "siteStats", map); - } - - /** - * Gets the Statsd service hostname - */ - public ApiResponse optionStatsdHost() throws ClientApiException { - return api.callApi("stats", "view", "optionStatsdHost", null); - } - - /** - * Gets the Statsd service port - */ - public ApiResponse optionStatsdPort() throws ClientApiException { - return api.callApi("stats", "view", "optionStatsdPort", null); - } - - /** - * Gets the prefix to be applied to all stats sent to the configured Statsd service - */ - public ApiResponse optionStatsdPrefix() throws ClientApiException { - return api.callApi("stats", "view", "optionStatsdPrefix", null); - } - - /** - * Returns 'true' if in memory statistics are enabled, otherwise returns 'false' - */ - public ApiResponse optionInMemoryEnabled() throws ClientApiException { - return api.callApi("stats", "view", "optionInMemoryEnabled", null); - } - - /** - * Returns 'true' if a Statsd server has been correctly configured, otherwise returns 'false' - */ - public ApiResponse optionStatsdEnabled() throws ClientApiException { - return api.callApi("stats", "view", "optionStatsdEnabled", null); - } - - /** - * Clears all of the statistics - */ - public ApiResponse clearStats(String keyprefix) throws ClientApiException { - Map map = new HashMap<>(); - if (keyprefix != null) { - map.put("keyPrefix", keyprefix); - } - return api.callApi("stats", "action", "clearStats", map); - } - - /** - * Sets the Statsd service hostname, supply an empty string to stop using a Statsd service - */ - public ApiResponse setOptionStatsdHost(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("stats", "action", "setOptionStatsdHost", map); - } - - /** - * Sets the prefix to be applied to all stats sent to the configured Statsd service - */ - public ApiResponse setOptionStatsdPrefix(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("stats", "action", "setOptionStatsdPrefix", map); - } - - /** - * Sets whether in memory statistics are enabled - */ - public ApiResponse setOptionInMemoryEnabled(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("stats", "action", "setOptionInMemoryEnabled", map); - } - - /** - * Sets the Statsd service port - */ - public ApiResponse setOptionStatsdPort(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("stats", "action", "setOptionStatsdPort", map); - } - + private final ClientApi api; + + public Stats(ClientApi api) { + super(api); + this.api = api; + } + + /** Statistics */ + public ApiResponse stats(String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); + if (keyprefix != null) { + map.put("keyPrefix", keyprefix); + } + return api.callApi("stats", "view", "stats", map); + } + + /** Gets all of the site based statistics, optionally filtered by a key prefix */ + public ApiResponse allSitesStats(String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); + if (keyprefix != null) { + map.put("keyPrefix", keyprefix); + } + return api.callApi("stats", "view", "allSitesStats", map); + } + + /** Gets all of the global statistics, optionally filtered by a key prefix */ + public ApiResponse siteStats(String site, String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + if (keyprefix != null) { + map.put("keyPrefix", keyprefix); + } + return api.callApi("stats", "view", "siteStats", map); + } + + /** Gets the Statsd service hostname */ + public ApiResponse optionStatsdHost() throws ClientApiException { + return api.callApi("stats", "view", "optionStatsdHost", null); + } + + /** Gets the Statsd service port */ + public ApiResponse optionStatsdPort() throws ClientApiException { + return api.callApi("stats", "view", "optionStatsdPort", null); + } + + /** Gets the prefix to be applied to all stats sent to the configured Statsd service */ + public ApiResponse optionStatsdPrefix() throws ClientApiException { + return api.callApi("stats", "view", "optionStatsdPrefix", null); + } + + /** Returns 'true' if in memory statistics are enabled, otherwise returns 'false' */ + public ApiResponse optionInMemoryEnabled() throws ClientApiException { + return api.callApi("stats", "view", "optionInMemoryEnabled", null); + } + + /** + * Returns 'true' if a Statsd server has been correctly configured, otherwise returns 'false' + */ + public ApiResponse optionStatsdEnabled() throws ClientApiException { + return api.callApi("stats", "view", "optionStatsdEnabled", null); + } + + /** Clears all of the statistics */ + public ApiResponse clearStats(String keyprefix) throws ClientApiException { + Map map = new HashMap<>(); + if (keyprefix != null) { + map.put("keyPrefix", keyprefix); + } + return api.callApi("stats", "action", "clearStats", map); + } + + /** Sets the Statsd service hostname, supply an empty string to stop using a Statsd service */ + public ApiResponse setOptionStatsdHost(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("stats", "action", "setOptionStatsdHost", map); + } + + /** Sets the prefix to be applied to all stats sent to the configured Statsd service */ + public ApiResponse setOptionStatsdPrefix(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("stats", "action", "setOptionStatsdPrefix", map); + } + + /** Sets whether in memory statistics are enabled */ + public ApiResponse setOptionInMemoryEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("stats", "action", "setOptionInMemoryEnabled", map); + } + + /** Sets the Statsd service port */ + public ApiResponse setOptionStatsdPort(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("stats", "action", "setOptionStatsdPort", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 6489f52..87e4333 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -25,90 +25,92 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; - -/** - * This file was automatically generated. - */ +/** This file was automatically generated. */ @SuppressWarnings("javadoc") public class Users extends org.zaproxy.clientapi.gen.deprecated.UsersDeprecated { - private final ClientApi api; - - public Users(ClientApi api) { - super(api); - this.api = api; - } + private final ClientApi api; - public ApiResponse usersList(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - if (contextid != null) { - map.put("contextId", contextid); - } - return api.callApi("users", "view", "usersList", map); - } + public Users(ClientApi api) { + super(api); + this.api = api; + } - public ApiResponse getUserById(String contextid, String userid) throws ClientApiException { - Map map = new HashMap<>(); - if (contextid != null) { - map.put("contextId", contextid); - } - if (userid != null) { - map.put("userId", userid); - } - return api.callApi("users", "view", "getUserById", map); - } + public ApiResponse usersList(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + if (contextid != null) { + map.put("contextId", contextid); + } + return api.callApi("users", "view", "usersList", map); + } - public ApiResponse getAuthenticationCredentialsConfigParams(String contextid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - return api.callApi("users", "view", "getAuthenticationCredentialsConfigParams", map); - } + public ApiResponse getUserById(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + if (contextid != null) { + map.put("contextId", contextid); + } + if (userid != null) { + map.put("userId", userid); + } + return api.callApi("users", "view", "getUserById", map); + } - public ApiResponse getAuthenticationCredentials(String contextid, String userid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - return api.callApi("users", "view", "getAuthenticationCredentials", map); - } + public ApiResponse getAuthenticationCredentialsConfigParams(String contextid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("users", "view", "getAuthenticationCredentialsConfigParams", map); + } - public ApiResponse newUser(String contextid, String name) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("name", name); - return api.callApi("users", "action", "newUser", map); - } + public ApiResponse getAuthenticationCredentials(String contextid, String userid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "view", "getAuthenticationCredentials", map); + } - public ApiResponse removeUser(String contextid, String userid) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - return api.callApi("users", "action", "removeUser", map); - } + public ApiResponse newUser(String contextid, String name) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("name", name); + return api.callApi("users", "action", "newUser", map); + } - public ApiResponse setUserEnabled(String contextid, String userid, String enabled) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - map.put("enabled", enabled); - return api.callApi("users", "action", "setUserEnabled", map); - } + public ApiResponse removeUser(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "action", "removeUser", map); + } - public ApiResponse setUserName(String contextid, String userid, String name) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - map.put("name", name); - return api.callApi("users", "action", "setUserName", map); - } + public ApiResponse setUserEnabled(String contextid, String userid, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + map.put("enabled", enabled); + return api.callApi("users", "action", "setUserEnabled", map); + } - public ApiResponse setAuthenticationCredentials(String contextid, String userid, String authcredentialsconfigparams) throws ClientApiException { - Map map = new HashMap<>(); - map.put("contextId", contextid); - map.put("userId", userid); - if (authcredentialsconfigparams != null) { - map.put("authCredentialsConfigParams", authcredentialsconfigparams); - } - return api.callApi("users", "action", "setAuthenticationCredentials", map); - } + public ApiResponse setUserName(String contextid, String userid, String name) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + map.put("name", name); + return api.callApi("users", "action", "setUserName", map); + } + public ApiResponse setAuthenticationCredentials( + String contextid, String userid, String authcredentialsconfigparams) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + if (authcredentialsconfigparams != null) { + map.put("authCredentialsConfigParams", authcredentialsconfigparams); + } + return api.callApi("users", "action", "setAuthenticationCredentials", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java index 66a711a..312522d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AcsrfDeprecated { @@ -39,8 +36,9 @@ public AcsrfDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse addOptionToken(String apikey, String string) throws ClientApiException { @@ -53,8 +51,9 @@ public ApiResponse addOptionToken(String apikey, String string) throws ClientApi } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeOptionToken(String apikey, String string) throws ClientApiException { @@ -67,8 +66,9 @@ public ApiResponse removeOptionToken(String apikey, String string) throws Client } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] genForm(String apikey, String hrefid) throws ClientApiException { @@ -79,5 +79,4 @@ public byte[] genForm(String apikey, String hrefid) throws ClientApiException { map.put("hrefId", hrefid); return api.callApiOther("acsrf", "other", "genForm", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java index ed149bd..870391c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AjaxSpiderDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AjaxSpiderDeprecated { @@ -40,9 +37,10 @@ public AjaxSpiderDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed. - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse scan(String apikey, String url, String inscope) throws ClientApiException { @@ -61,9 +59,10 @@ public ApiResponse scan(String apikey, String url, String inscope) throws Client /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stop(String apikey) throws ClientApiException { @@ -76,9 +75,10 @@ public ApiResponse stop(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionBrowserId(String apikey, String string) throws ClientApiException { @@ -92,12 +92,14 @@ public ApiResponse setOptionBrowserId(String apikey, String string) throws Clien /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -108,12 +110,14 @@ public ApiResponse setOptionClickDefaultElems(String apikey, boolean bool) throw /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -124,9 +128,10 @@ public ApiResponse setOptionClickElemsOnce(String apikey, boolean bool) throws C /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiException { @@ -140,9 +145,10 @@ public ApiResponse setOptionEventWait(String apikey, int i) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApiException { @@ -156,9 +162,10 @@ public ApiResponse setOptionMaxCrawlDepth(String apikey, int i) throws ClientApi /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientApiException { @@ -172,9 +179,10 @@ public ApiResponse setOptionMaxCrawlStates(String apikey, int i) throws ClientAp /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { @@ -188,9 +196,10 @@ public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws ClientApiException { @@ -204,12 +213,14 @@ public ApiResponse setOptionNumberOfBrowsers(String apikey, int i) throws Client /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionRandomInputs(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -220,9 +231,10 @@ public ApiResponse setOptionRandomInputs(String apikey, boolean bool) throws Cli /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionReloadWait(String apikey, int i) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java index 06c4287..a95658c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AscanDeprecated { @@ -39,8 +36,9 @@ public AscanDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse scan( @@ -50,7 +48,8 @@ public ApiResponse scan( String inscopeonly, String scanpolicyname, String method, - String postdata) throws ClientApiException { + String postdata) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -75,8 +74,9 @@ public ApiResponse scan( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse scanAsUser( @@ -87,7 +87,8 @@ public ApiResponse scanAsUser( String recurse, String scanpolicyname, String method, - String postdata) throws ClientApiException { + String postdata) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -111,8 +112,9 @@ public ApiResponse scanAsUser( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse pause(String apikey, String scanid) throws ClientApiException { @@ -125,8 +127,9 @@ public ApiResponse pause(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse resume(String apikey, String scanid) throws ClientApiException { @@ -139,8 +142,9 @@ public ApiResponse resume(String apikey, String scanid) throws ClientApiExceptio } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stop(String apikey, String scanid) throws ClientApiException { @@ -153,8 +157,9 @@ public ApiResponse stop(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { @@ -167,8 +172,9 @@ public ApiResponse removeScan(String apikey, String scanid) throws ClientApiExce } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse pauseAllScans(String apikey) throws ClientApiException { @@ -180,8 +186,9 @@ public ApiResponse pauseAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse resumeAllScans(String apikey) throws ClientApiException { @@ -193,8 +200,9 @@ public ApiResponse resumeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stopAllScans(String apikey) throws ClientApiException { @@ -206,8 +214,9 @@ public ApiResponse stopAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeAllScans(String apikey) throws ClientApiException { @@ -219,8 +228,9 @@ public ApiResponse removeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { @@ -232,8 +242,9 @@ public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiExceptio } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { @@ -246,11 +257,13 @@ public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApi } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse enableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { + public ApiResponse enableAllScanners(String apikey, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -262,11 +275,13 @@ public ApiResponse enableAllScanners(String apikey, String scanpolicyname) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse disableAllScanners(String apikey, String scanpolicyname) throws ClientApiException { + public ApiResponse disableAllScanners(String apikey, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -278,11 +293,13 @@ public ApiResponse disableAllScanners(String apikey, String scanpolicyname) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse enableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { + public ApiResponse enableScanners(String apikey, String ids, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -295,11 +312,13 @@ public ApiResponse enableScanners(String apikey, String ids, String scanpolicyna } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse disableScanners(String apikey, String ids, String scanpolicyname) throws ClientApiException { + public ApiResponse disableScanners(String apikey, String ids, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -312,11 +331,13 @@ public ApiResponse disableScanners(String apikey, String ids, String scanpolicyn } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpolicyname) throws ClientApiException { + public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -329,11 +350,13 @@ public ApiResponse setEnabledPolicies(String apikey, String ids, String scanpoli } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setPolicyAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) + public ApiResponse setPolicyAttackStrength( + String apikey, String id, String attackstrength, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -348,11 +371,13 @@ public ApiResponse setPolicyAttackStrength(String apikey, String id, String atta } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setPolicyAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) + public ApiResponse setPolicyAlertThreshold( + String apikey, String id, String alertthreshold, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -367,11 +392,13 @@ public ApiResponse setPolicyAlertThreshold(String apikey, String id, String aler } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setScannerAttackStrength(String apikey, String id, String attackstrength, String scanpolicyname) + public ApiResponse setScannerAttackStrength( + String apikey, String id, String attackstrength, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -386,11 +413,13 @@ public ApiResponse setScannerAttackStrength(String apikey, String id, String att } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold, String scanpolicyname) + public ApiResponse setScannerAlertThreshold( + String apikey, String id, String alertthreshold, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -405,11 +434,13 @@ public ApiResponse setScannerAlertThreshold(String apikey, String id, String ale } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse addScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { + public ApiResponse addScanPolicy(String apikey, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -419,11 +450,13 @@ public ApiResponse addScanPolicy(String apikey, String scanpolicyname) throws Cl } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) throws ClientApiException { + public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -433,11 +466,13 @@ public ApiResponse removeScanPolicy(String apikey, String scanpolicyname) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionAttackPolicy(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionAttackPolicy(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -447,11 +482,13 @@ public ApiResponse setOptionAttackPolicy(String apikey, String string) throws Cl } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionDefaultPolicy(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionDefaultPolicy(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -461,11 +498,13 @@ public ApiResponse setOptionDefaultPolicy(String apikey, String string) throws C } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -475,8 +514,9 @@ public ApiResponse setOptionAllowAttackOnStart(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionDelayInMs(String apikey, int i) throws ClientApiException { @@ -489,11 +529,13 @@ public ApiResponse setOptionDelayInMs(String apikey, int i) throws ClientApiExce } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -503,8 +545,9 @@ public ApiResponse setOptionHandleAntiCSRFTokens(String apikey, boolean bool) th } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionHostPerScan(String apikey, int i) throws ClientApiException { @@ -517,11 +560,13 @@ public ApiResponse setOptionHostPerScan(String apikey, int i) throws ClientApiEx } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -531,8 +576,9 @@ public ApiResponse setOptionInjectPluginIdInHeader(String apikey, boolean bool) } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxChartTimeInMins(String apikey, int i) throws ClientApiException { @@ -545,8 +591,9 @@ public ApiResponse setOptionMaxChartTimeInMins(String apikey, int i) throws Clie } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxResultsToList(String apikey, int i) throws ClientApiException { @@ -559,8 +606,9 @@ public ApiResponse setOptionMaxResultsToList(String apikey, int i) throws Client } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { @@ -573,11 +621,13 @@ public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiE } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -587,11 +637,13 @@ public ApiResponse setOptionPromptInAttackMode(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -601,11 +653,13 @@ public ApiResponse setOptionPromptToClearFinishedScans(String apikey, boolean bo } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -615,11 +669,13 @@ public ApiResponse setOptionRescanInAttackMode(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -629,11 +685,13 @@ public ApiResponse setOptionScanHeadersAllRequests(String apikey, boolean bool) } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -643,11 +701,13 @@ public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -657,11 +717,13 @@ public ApiResponse setOptionTargetParamsEnabledRPC(String apikey, int i) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) throws ClientApiException { + public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -671,8 +733,9 @@ public ApiResponse setOptionTargetParamsInjectable(String apikey, int i) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionThreadPerHost(String apikey, int i) throws ClientApiException { @@ -683,5 +746,4 @@ public ApiResponse setOptionThreadPerHost(String apikey, int i) throws ClientApi map.put("Integer", Integer.toString(i)); return api.callApi("ascan", "action", "setOptionThreadPerHost", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java index a264e5d..19d1f39 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthenticationDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AuthenticationDeprecated { @@ -39,15 +36,14 @@ public AuthenticationDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setAuthenticationMethod( - String apikey, - String contextid, - String authmethodname, - String authmethodconfigparams) throws ClientApiException { + String apikey, String contextid, String authmethodname, String authmethodconfigparams) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -61,11 +57,13 @@ public ApiResponse setAuthenticationMethod( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setLoggedInIndicator(String apikey, String contextid, String loggedinindicatorregex) + public ApiResponse setLoggedInIndicator( + String apikey, String contextid, String loggedinindicatorregex) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -77,11 +75,13 @@ public ApiResponse setLoggedInIndicator(String apikey, String contextid, String } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setLoggedOutIndicator(String apikey, String contextid, String loggedoutindicatorregex) + public ApiResponse setLoggedOutIndicator( + String apikey, String contextid, String loggedoutindicatorregex) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -91,5 +91,4 @@ public ApiResponse setLoggedOutIndicator(String apikey, String contextid, String map.put("loggedOutIndicatorRegex", loggedoutindicatorregex); return api.callApi("authentication", "action", "setLoggedOutIndicator", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java index c0880df..2cb0ec4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AuthorizationDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AuthorizationDeprecated { @@ -39,8 +36,9 @@ public AuthorizationDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setBasicAuthorizationDetectionMethod( @@ -49,7 +47,8 @@ public ApiResponse setBasicAuthorizationDetectionMethod( String headerregex, String bodyregex, String statuscode, - String logicaloperator) throws ClientApiException { + String logicaloperator) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -69,5 +68,4 @@ public ApiResponse setBasicAuthorizationDetectionMethod( } return api.callApi("authorization", "action", "setBasicAuthorizationDetectionMethod", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java index 606fca4..5947eaf 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AutoupdateDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class AutoupdateDeprecated { @@ -39,8 +36,9 @@ public AutoupdateDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse downloadLatestRelease(String apikey) throws ClientApiException { @@ -52,11 +50,13 @@ public ApiResponse downloadLatestRelease(String apikey) throws ClientApiExceptio } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -66,11 +66,13 @@ public ApiResponse setOptionCheckAddonUpdates(String apikey, boolean bool) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -80,11 +82,13 @@ public ApiResponse setOptionCheckOnStart(String apikey, boolean bool) throws Cli } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -94,11 +98,13 @@ public ApiResponse setOptionDownloadNewRelease(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -108,11 +114,13 @@ public ApiResponse setOptionInstallAddonUpdates(String apikey, boolean bool) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -122,11 +130,13 @@ public ApiResponse setOptionInstallScannerRules(String apikey, boolean bool) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -136,11 +146,13 @@ public ApiResponse setOptionReportAlphaAddons(String apikey, boolean bool) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -150,11 +162,13 @@ public ApiResponse setOptionReportBetaAddons(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionReportReleaseAddons(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionReportReleaseAddons(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -162,5 +176,4 @@ public ApiResponse setOptionReportReleaseAddons(String apikey, boolean bool) thr map.put("Boolean", Boolean.toString(bool)); return api.callApi("autoupdate", "action", "setOptionReportReleaseAddons", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java index b2da9bd..1f12222 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/BreakDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class BreakDeprecated { @@ -39,11 +36,13 @@ public BreakDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse brk(String apikey, String type, String scope, String state) throws ClientApiException { + public ApiResponse brk(String apikey, String type, String scope, String state) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -55,8 +54,9 @@ public ApiResponse brk(String apikey, String type, String scope, String state) t } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse addHttpBreakpoint( @@ -65,7 +65,8 @@ public ApiResponse addHttpBreakpoint( String location, String match, String inverse, - String ignorecase) throws ClientApiException { + String ignorecase) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -79,8 +80,9 @@ public ApiResponse addHttpBreakpoint( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeHttpBreakpoint( @@ -89,7 +91,8 @@ public ApiResponse removeHttpBreakpoint( String location, String match, String inverse, - String ignorecase) throws ClientApiException { + String ignorecase) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -101,5 +104,4 @@ public ApiResponse removeHttpBreakpoint( map.put("ignorecase", ignorecase); return api.callApi("break", "action", "removeHttpBreakpoint", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java index b9ea12a..d9990e0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ContextDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class ContextDeprecated { @@ -39,11 +36,13 @@ public ContextDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse excludeFromContext(String apikey, String contextname, String regex) throws ClientApiException { + public ApiResponse excludeFromContext(String apikey, String contextname, String regex) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -54,11 +53,13 @@ public ApiResponse excludeFromContext(String apikey, String contextname, String } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse includeInContext(String apikey, String contextname, String regex) throws ClientApiException { + public ApiResponse includeInContext(String apikey, String contextname, String regex) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -69,8 +70,9 @@ public ApiResponse includeInContext(String apikey, String contextname, String re } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse newContext(String apikey, String contextname) throws ClientApiException { @@ -83,8 +85,9 @@ public ApiResponse newContext(String apikey, String contextname) throws ClientAp } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeContext(String apikey, String contextname) throws ClientApiException { @@ -97,11 +100,13 @@ public ApiResponse removeContext(String apikey, String contextname) throws Clien } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse exportContext(String apikey, String contextname, String contextfile) throws ClientApiException { + public ApiResponse exportContext(String apikey, String contextname, String contextfile) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -112,8 +117,9 @@ public ApiResponse exportContext(String apikey, String contextname, String conte } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse importContext(String apikey, String contextfile) throws ClientApiException { @@ -126,12 +132,13 @@ public ApiResponse importContext(String apikey, String contextfile) throws Clien } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse includeContextTechnologies(String apikey, String contextname, String technologynames) - throws ClientApiException { + public ApiResponse includeContextTechnologies( + String apikey, String contextname, String technologynames) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -142,11 +149,13 @@ public ApiResponse includeContextTechnologies(String apikey, String contextname, } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse includeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { + public ApiResponse includeAllContextTechnologies(String apikey, String contextname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -156,12 +165,13 @@ public ApiResponse includeAllContextTechnologies(String apikey, String contextna } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse excludeContextTechnologies(String apikey, String contextname, String technologynames) - throws ClientApiException { + public ApiResponse excludeContextTechnologies( + String apikey, String contextname, String technologynames) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -172,11 +182,13 @@ public ApiResponse excludeContextTechnologies(String apikey, String contextname, } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse excludeAllContextTechnologies(String apikey, String contextname) throws ClientApiException { + public ApiResponse excludeAllContextTechnologies(String apikey, String contextname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -186,11 +198,13 @@ public ApiResponse excludeAllContextTechnologies(String apikey, String contextna } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setContextInScope(String apikey, String contextname, String booleaninscope) throws ClientApiException { + public ApiResponse setContextInScope(String apikey, String contextname, String booleaninscope) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -199,5 +213,4 @@ public ApiResponse setContextInScope(String apikey, String contextname, String b map.put("booleanInScope", booleaninscope); return api.callApi("context", "action", "setContextInScope", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java index f08b629..91abb53 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class CoreDeprecated { @@ -39,11 +36,13 @@ public CoreDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse accessUrl(String apikey, String url, String followredirects) throws ClientApiException { + public ApiResponse accessUrl(String apikey, String url, String followredirects) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -56,8 +55,9 @@ public ApiResponse accessUrl(String apikey, String url, String followredirects) } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse shutdown(String apikey) throws ClientApiException { @@ -69,11 +69,13 @@ public ApiResponse shutdown(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse newSession(String apikey, String name, String overwrite) throws ClientApiException { + public ApiResponse newSession(String apikey, String name, String overwrite) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -88,8 +90,9 @@ public ApiResponse newSession(String apikey, String name, String overwrite) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse loadSession(String apikey, String name) throws ClientApiException { @@ -102,11 +105,13 @@ public ApiResponse loadSession(String apikey, String name) throws ClientApiExcep } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse saveSession(String apikey, String name, String overwrite) throws ClientApiException { + public ApiResponse saveSession(String apikey, String name, String overwrite) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -119,8 +124,9 @@ public ApiResponse saveSession(String apikey, String name, String overwrite) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse snapshotSession(String apikey) throws ClientApiException { @@ -132,8 +138,9 @@ public ApiResponse snapshotSession(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse clearExcludedFromProxy(String apikey) throws ClientApiException { @@ -145,8 +152,9 @@ public ApiResponse clearExcludedFromProxy(String apikey) throws ClientApiExcepti } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse excludeFromProxy(String apikey, String regex) throws ClientApiException { @@ -159,8 +167,9 @@ public ApiResponse excludeFromProxy(String apikey, String regex) throws ClientAp } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiException { @@ -173,8 +182,9 @@ public ApiResponse setHomeDirectory(String apikey, String dir) throws ClientApiE } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setMode(String apikey, String mode) throws ClientApiException { @@ -187,8 +197,9 @@ public ApiResponse setMode(String apikey, String mode) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse generateRootCA(String apikey) throws ClientApiException { @@ -200,11 +211,13 @@ public ApiResponse generateRootCA(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse sendRequest(String apikey, String request, String followredirects) throws ClientApiException { + public ApiResponse sendRequest(String apikey, String request, String followredirects) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -217,8 +230,9 @@ public ApiResponse sendRequest(String apikey, String request, String followredir } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse deleteAllAlerts(String apikey) throws ClientApiException { @@ -230,8 +244,9 @@ public ApiResponse deleteAllAlerts(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse runGarbageCollection(String apikey) throws ClientApiException { @@ -243,11 +258,13 @@ public ApiResponse runGarbageCollection(String apikey) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse deleteSiteNode(String apikey, String url, String method, String postdata) throws ClientApiException { + public ApiResponse deleteSiteNode(String apikey, String url, String method, String postdata) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -263,11 +280,13 @@ public ApiResponse deleteSiteNode(String apikey, String url, String method, Stri } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionDefaultUserAgent(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionDefaultUserAgent(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -277,11 +296,13 @@ public ApiResponse setOptionDefaultUserAgent(String apikey, String string) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainName(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionProxyChainName(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -291,11 +312,13 @@ public ApiResponse setOptionProxyChainName(String apikey, String string) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainPassword(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionProxyChainPassword(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -305,11 +328,13 @@ public ApiResponse setOptionProxyChainPassword(String apikey, String string) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainRealm(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionProxyChainRealm(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -319,11 +344,13 @@ public ApiResponse setOptionProxyChainRealm(String apikey, String string) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainSkipName(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionProxyChainSkipName(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -333,11 +360,13 @@ public ApiResponse setOptionProxyChainSkipName(String apikey, String string) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainUserName(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionProxyChainUserName(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -347,11 +376,13 @@ public ApiResponse setOptionProxyChainUserName(String apikey, String string) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -361,8 +392,9 @@ public ApiResponse setOptionHttpStateEnabled(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionProxyChainPort(String apikey, int i) throws ClientApiException { @@ -375,11 +407,13 @@ public ApiResponse setOptionProxyChainPort(String apikey, int i) throws ClientAp } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -389,11 +423,13 @@ public ApiResponse setOptionProxyChainPrompt(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -403,8 +439,9 @@ public ApiResponse setOptionSingleCookieRequestHeader(String apikey, boolean boo } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionTimeoutInSecs(String apikey, int i) throws ClientApiException { @@ -417,11 +454,13 @@ public ApiResponse setOptionTimeoutInSecs(String apikey, int i) throws ClientApi } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -431,11 +470,13 @@ public ApiResponse setOptionUseProxyChain(String apikey, boolean bool) throws Cl } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -445,8 +486,9 @@ public ApiResponse setOptionUseProxyChainAuth(String apikey, boolean bool) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] proxypac(String apikey) throws ClientApiException { @@ -458,8 +500,9 @@ public byte[] proxypac(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] rootcert(String apikey) throws ClientApiException { @@ -471,8 +514,9 @@ public byte[] rootcert(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] setproxy(String apikey, String proxy) throws ClientApiException { @@ -485,8 +529,9 @@ public byte[] setproxy(String apikey, String proxy) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] xmlreport(String apikey) throws ClientApiException { @@ -498,8 +543,9 @@ public byte[] xmlreport(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] htmlreport(String apikey) throws ClientApiException { @@ -511,8 +557,9 @@ public byte[] htmlreport(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] messageHar(String apikey, String id) throws ClientApiException { @@ -525,11 +572,13 @@ public byte[] messageHar(String apikey, String id) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] messagesHar(String apikey, String baseurl, String start, String count) throws ClientApiException { + public byte[] messagesHar(String apikey, String baseurl, String start, String count) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -547,11 +596,13 @@ public byte[] messagesHar(String apikey, String baseurl, String start, String co } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] sendHarRequest(String apikey, String request, String followredirects) throws ClientApiException { + public byte[] sendHarRequest(String apikey, String request, String followredirects) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -564,9 +615,11 @@ public byte[] sendHarRequest(String apikey, String request, String followredirec } /** - * Gets the alerts raised by ZAP, optionally filtering by URL and paginating with 'start' position and 'count' of alerts + * Gets the alerts raised by ZAP, optionally filtering by URL and paginating with 'start' + * position and 'count' of alerts */ - public ApiResponse alerts(String baseurl, String start, String count) throws ClientApiException { + public ApiResponse alerts(String baseurl, String start, String count) + throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); @@ -580,9 +633,7 @@ public ApiResponse alerts(String baseurl, String start, String count) throws Cli return api.callApi("core", "view", "alerts", map); } - /** - * Gets the number of alerts, optionally filtering by URL - */ + /** Gets the number of alerts, optionally filtering by URL */ public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { @@ -591,9 +642,7 @@ public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { return api.callApi("core", "view", "numberOfAlerts", map); } - /** - * Gets the URLs accessed through/by ZAP - */ + /** Gets the URLs accessed through/by ZAP */ public ApiResponse urls() throws ClientApiException { return api.callApi("core", "view", "urls", null); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java index f3d7932..67057a4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ForcedUserDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class ForcedUserDeprecated { @@ -39,11 +36,13 @@ public ForcedUserDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setForcedUser(String apikey, String contextid, String userid) throws ClientApiException { + public ApiResponse setForcedUser(String apikey, String contextid, String userid) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -54,11 +53,13 @@ public ApiResponse setForcedUser(String apikey, String contextid, String userid) } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setForcedUserModeEnabled(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setForcedUserModeEnabled(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -66,5 +67,4 @@ public ApiResponse setForcedUserModeEnabled(String apikey, boolean bool) throws map.put("boolean", Boolean.toString(bool)); return api.callApi("forcedUser", "action", "setForcedUserModeEnabled", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java index fe4e4e5..2e5fa47 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/HttpSessionsDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class HttpSessionsDeprecated { @@ -39,11 +36,13 @@ public HttpSessionsDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse createEmptySession(String apikey, String site, String session) throws ClientApiException { + public ApiResponse createEmptySession(String apikey, String site, String session) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -56,11 +55,13 @@ public ApiResponse createEmptySession(String apikey, String site, String session } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse removeSession(String apikey, String site, String session) throws ClientApiException { + public ApiResponse removeSession(String apikey, String site, String session) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -71,11 +72,13 @@ public ApiResponse removeSession(String apikey, String site, String session) thr } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setActiveSession(String apikey, String site, String session) throws ClientApiException { + public ApiResponse setActiveSession(String apikey, String site, String session) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -86,8 +89,9 @@ public ApiResponse setActiveSession(String apikey, String site, String session) } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse unsetActiveSession(String apikey, String site) throws ClientApiException { @@ -100,11 +104,13 @@ public ApiResponse unsetActiveSession(String apikey, String site) throws ClientA } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse addSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { + public ApiResponse addSessionToken(String apikey, String site, String sessiontoken) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -115,11 +121,13 @@ public ApiResponse addSessionToken(String apikey, String site, String sessiontok } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse removeSessionToken(String apikey, String site, String sessiontoken) throws ClientApiException { + public ApiResponse removeSessionToken(String apikey, String site, String sessiontoken) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -130,11 +138,13 @@ public ApiResponse removeSessionToken(String apikey, String site, String session } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setSessionTokenValue(String apikey, String site, String session, String sessiontoken, String tokenvalue) + public ApiResponse setSessionTokenValue( + String apikey, String site, String session, String sessiontoken, String tokenvalue) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -148,11 +158,13 @@ public ApiResponse setSessionTokenValue(String apikey, String site, String sessi } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse renameSession(String apikey, String site, String oldsessionname, String newsessionname) + public ApiResponse renameSession( + String apikey, String site, String oldsessionname, String newsessionname) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -163,5 +175,4 @@ public ApiResponse renameSession(String apikey, String site, String oldsessionna map.put("newSessionName", newsessionname); return api.callApi("httpSessions", "action", "renameSession", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java index 521dad9..876e000 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ImportLogFilesDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class ImportLogFilesDeprecated { @@ -40,12 +37,14 @@ public ImportLogFilesDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse ImportZAPLogFromFile(String apikey, String filepath) throws ClientApiException { + public ApiResponse ImportZAPLogFromFile(String apikey, String filepath) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -56,12 +55,14 @@ public ApiResponse ImportZAPLogFromFile(String apikey, String filepath) throws C /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse ImportModSecurityLogFromFile(String apikey, String filepath) throws ClientApiException { + public ApiResponse ImportModSecurityLogFromFile(String apikey, String filepath) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -72,12 +73,14 @@ public ApiResponse ImportModSecurityLogFromFile(String apikey, String filepath) /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse ImportZAPHttpRequestResponsePair(String apikey, String httprequest, String httpresponse) throws ClientApiException { + public ApiResponse ImportZAPHttpRequestResponsePair( + String apikey, String httprequest, String httpresponse) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -89,12 +92,14 @@ public ApiResponse ImportZAPHttpRequestResponsePair(String apikey, String httpre /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { + public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstring) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -107,12 +112,14 @@ public ApiResponse PostModSecurityAuditEvent(String apikey, String auditeventstr /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] OtherPostModSecurityAuditEvent(String apikey, String auditeventstring) throws ClientApiException { + public byte[] OtherPostModSecurityAuditEvent(String apikey, String auditeventstring) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java index 1e96713..2a9df9a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PnhDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class PnhDeprecated { @@ -40,9 +37,10 @@ public PnhDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse monitor(String apikey, String id, String message) throws ClientApiException { @@ -57,9 +55,10 @@ public ApiResponse monitor(String apikey, String id, String message) throws Clie /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse oracle(String apikey, String id) throws ClientApiException { @@ -73,9 +72,10 @@ public ApiResponse oracle(String apikey, String id) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse startMonitoring(String apikey, String url) throws ClientApiException { @@ -89,9 +89,10 @@ public ApiResponse startMonitoring(String apikey, String url) throws ClientApiEx /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiException { @@ -105,9 +106,10 @@ public ApiResponse stopMonitoring(String apikey, String id) throws ClientApiExce /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] pnh(String apikey) throws ClientApiException { @@ -120,9 +122,10 @@ public byte[] pnh(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] manifest(String apikey) throws ClientApiException { @@ -135,9 +138,10 @@ public byte[] manifest(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] service(String apikey) throws ClientApiException { @@ -150,9 +154,10 @@ public byte[] service(String apikey) throws ClientApiException { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public byte[] fx_pnhxpi(String apikey) throws ClientApiException { @@ -162,5 +167,4 @@ public byte[] fx_pnhxpi(String apikey) throws ClientApiException { } return api.callApiOther("pnh", "other", "fx_pnh.xpi", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java index 90fdded..427dc88 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/PscanDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class PscanDeprecated { @@ -39,8 +36,9 @@ public PscanDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiException { @@ -53,8 +51,9 @@ public ApiResponse setEnabled(String apikey, String enabled) throws ClientApiExc } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse enableAllScanners(String apikey) throws ClientApiException { @@ -66,8 +65,9 @@ public ApiResponse enableAllScanners(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse disableAllScanners(String apikey) throws ClientApiException { @@ -79,8 +79,9 @@ public ApiResponse disableAllScanners(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse enableScanners(String apikey, String ids) throws ClientApiException { @@ -93,8 +94,9 @@ public ApiResponse enableScanners(String apikey, String ids) throws ClientApiExc } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse disableScanners(String apikey, String ids) throws ClientApiException { @@ -107,11 +109,13 @@ public ApiResponse disableScanners(String apikey, String ids) throws ClientApiEx } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold) throws ClientApiException { + public ApiResponse setScannerAlertThreshold(String apikey, String id, String alertthreshold) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -120,5 +124,4 @@ public ApiResponse setScannerAlertThreshold(String apikey, String id, String ale map.put("alertThreshold", alertthreshold); return api.callApi("pscan", "action", "setScannerAlertThreshold", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java index de25806..c60aea5 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/RevealDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class RevealDeprecated { @@ -40,9 +37,10 @@ public RevealDeprecated(ClientApi api) { /** * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setReveal(String apikey, String reveal) throws ClientApiException { @@ -53,5 +51,4 @@ public ApiResponse setReveal(String apikey, String reveal) throws ClientApiExcep map.put("reveal", reveal); return api.callApi("reveal", "action", "setReveal", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java index bb99747..e62b008 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ScriptDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class ScriptDeprecated { @@ -39,8 +36,9 @@ public ScriptDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse enable(String apikey, String scriptname) throws ClientApiException { @@ -53,8 +51,9 @@ public ApiResponse enable(String apikey, String scriptname) throws ClientApiExce } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse disable(String apikey, String scriptname) throws ClientApiException { @@ -67,8 +66,9 @@ public ApiResponse disable(String apikey, String scriptname) throws ClientApiExc } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse load( @@ -77,7 +77,8 @@ public ApiResponse load( String scripttype, String scriptengine, String filename, - String scriptdescription) throws ClientApiException { + String scriptdescription) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -93,8 +94,9 @@ public ApiResponse load( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse remove(String apikey, String scriptname) throws ClientApiException { @@ -107,11 +109,13 @@ public ApiResponse remove(String apikey, String scriptname) throws ClientApiExce } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse runStandAloneScript(String apikey, String scriptname) throws ClientApiException { + public ApiResponse runStandAloneScript(String apikey, String scriptname) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -121,9 +125,16 @@ public ApiResponse runStandAloneScript(String apikey, String scriptname) throws } /** - * Loads a script into ZAP from the given local file, with the given name, type and engine, optionally with a description + * Loads a script into ZAP from the given local file, with the given name, type and engine, + * optionally with a description */ - public ApiResponse load(String scriptname, String scripttype, String scriptengine, String filename, String scriptdescription) throws ClientApiException { + public ApiResponse load( + String scriptname, + String scripttype, + String scriptengine, + String filename, + String scriptdescription) + throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); map.put("scriptType", scripttype); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java index b411ac2..d9a397e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SearchDeprecated.java @@ -21,13 +21,10 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class SearchDeprecated { @@ -38,11 +35,13 @@ public SearchDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String start, String count) + public byte[] harByUrlRegex( + String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -62,11 +61,13 @@ public byte[] harByUrlRegex(String apikey, String regex, String baseurl, String } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] harByRequestRegex(String apikey, String regex, String baseurl, String start, String count) + public byte[] harByRequestRegex( + String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -86,11 +87,13 @@ public byte[] harByRequestRegex(String apikey, String regex, String baseurl, Str } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] harByResponseRegex(String apikey, String regex, String baseurl, String start, String count) + public byte[] harByResponseRegex( + String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -110,11 +113,13 @@ public byte[] harByResponseRegex(String apikey, String regex, String baseurl, St } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public byte[] harByHeaderRegex(String apikey, String regex, String baseurl, String start, String count) + public byte[] harByHeaderRegex( + String apikey, String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -132,5 +137,4 @@ public byte[] harByHeaderRegex(String apikey, String regex, String baseurl, Stri } return api.callApiOther("search", "other", "harByHeaderRegex", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java index a597fdb..330d63a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SeleniumDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class SeleniumDeprecated { @@ -40,14 +37,16 @@ public SeleniumDeprecated(ClientApi api) { /** * Sets the current path to ChromeDriver - *

- * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + *

This component is optional and therefore the API will only work if it is installed + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionChromeDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionChromeDriverPath(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -58,14 +57,16 @@ public ApiResponse setOptionChromeDriverPath(String apikey, String string) throw /** * Sets the current path to Firefox binary - *

- * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + *

This component is optional and therefore the API will only work if it is installed + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -76,14 +77,16 @@ public ApiResponse setOptionFirefoxBinaryPath(String apikey, String string) thro /** * Sets the current path to Firefox driver (geckodriver) - *

- * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + *

This component is optional and therefore the API will only work if it is installed + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -94,14 +97,16 @@ public ApiResponse setOptionFirefoxDriverPath(String apikey, String string) thro /** * Sets the current path to IEDriverServer - *

- * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + *

This component is optional and therefore the API will only work if it is installed + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionIeDriverPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionIeDriverPath(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -112,14 +117,16 @@ public ApiResponse setOptionIeDriverPath(String apikey, String string) throws Cl /** * Sets the current path to PhantomJS binary - *

- * This component is optional and therefore the API will only work if it is installed - * - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * + *

This component is optional and therefore the API will only work if it is installed + * + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -127,5 +134,4 @@ public ApiResponse setOptionPhantomJsBinaryPath(String apikey, String string) th map.put("String", string); return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java index 9ff6b60..ccc6cfb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SessionManagementDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class SessionManagementDeprecated { @@ -39,11 +36,13 @@ public SessionManagementDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setSessionManagementMethod(String apikey, String contextid, String methodname, String methodconfigparams) + public ApiResponse setSessionManagementMethod( + String apikey, String contextid, String methodname, String methodconfigparams) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -56,5 +55,4 @@ public ApiResponse setSessionManagementMethod(String apikey, String contextid, S } return api.callApi("sessionManagement", "action", "setSessionManagementMethod", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java index d012878..ffc9421 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class SpiderDeprecated { @@ -39,8 +36,9 @@ public SpiderDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse scan( @@ -49,7 +47,8 @@ public ApiResponse scan( String maxchildren, String recurse, String contextname, - String subtreeonly) throws ClientApiException { + String subtreeonly) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -73,8 +72,9 @@ public ApiResponse scan( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse scanAsUser( @@ -84,7 +84,8 @@ public ApiResponse scanAsUser( String url, String maxchildren, String recurse, - String subtreeonly) throws ClientApiException { + String subtreeonly) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -107,8 +108,9 @@ public ApiResponse scanAsUser( } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse pause(String apikey, String scanid) throws ClientApiException { @@ -121,8 +123,9 @@ public ApiResponse pause(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse resume(String apikey, String scanid) throws ClientApiException { @@ -135,8 +138,9 @@ public ApiResponse resume(String apikey, String scanid) throws ClientApiExceptio } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stop(String apikey, String scanid) throws ClientApiException { @@ -151,8 +155,9 @@ public ApiResponse stop(String apikey, String scanid) throws ClientApiException } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeScan(String apikey, String scanid) throws ClientApiException { @@ -165,8 +170,9 @@ public ApiResponse removeScan(String apikey, String scanid) throws ClientApiExce } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse pauseAllScans(String apikey) throws ClientApiException { @@ -178,8 +184,9 @@ public ApiResponse pauseAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse resumeAllScans(String apikey) throws ClientApiException { @@ -191,8 +198,9 @@ public ApiResponse resumeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse stopAllScans(String apikey) throws ClientApiException { @@ -204,8 +212,9 @@ public ApiResponse stopAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse removeAllScans(String apikey) throws ClientApiException { @@ -217,8 +226,9 @@ public ApiResponse removeAllScans(String apikey) throws ClientApiException { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiException { @@ -230,8 +240,9 @@ public ApiResponse clearExcludedFromScan(String apikey) throws ClientApiExceptio } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApiException { @@ -244,11 +255,13 @@ public ApiResponse excludeFromScan(String apikey, String regex) throws ClientApi } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionHandleParameters(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionHandleParameters(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -258,11 +271,13 @@ public ApiResponse setOptionHandleParameters(String apikey, String string) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionScopeString(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionScopeString(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -272,11 +287,13 @@ public ApiResponse setOptionScopeString(String apikey, String string) throws Cli } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionSkipURLString(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionSkipURLString(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -286,8 +303,9 @@ public ApiResponse setOptionSkipURLString(String apikey, String string) throws C } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionUserAgent(String apikey, String string) throws ClientApiException { @@ -300,11 +318,13 @@ public ApiResponse setOptionUserAgent(String apikey, String string) throws Clien } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -314,8 +334,9 @@ public ApiResponse setOptionHandleODataParametersVisited(String apikey, boolean } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxDepth(String apikey, int i) throws ClientApiException { @@ -328,8 +349,9 @@ public ApiResponse setOptionMaxDepth(String apikey, int i) throws ClientApiExcep } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiException { @@ -342,8 +364,9 @@ public ApiResponse setOptionMaxDuration(String apikey, int i) throws ClientApiEx } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiException { @@ -356,11 +379,13 @@ public ApiResponse setOptionMaxScansInUI(String apikey, int i) throws ClientApiE } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionParseComments(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionParseComments(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -370,8 +395,9 @@ public ApiResponse setOptionParseComments(String apikey, boolean bool) throws Cl } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionParseGit(String apikey, boolean bool) throws ClientApiException { @@ -384,11 +410,13 @@ public ApiResponse setOptionParseGit(String apikey, boolean bool) throws ClientA } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -398,11 +426,13 @@ public ApiResponse setOptionParseRobotsTxt(String apikey, boolean bool) throws C } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -412,11 +442,13 @@ public ApiResponse setOptionParseSVNEntries(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -426,8 +458,9 @@ public ApiResponse setOptionParseSitemapXml(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionPostForm(String apikey, boolean bool) throws ClientApiException { @@ -440,8 +473,9 @@ public ApiResponse setOptionPostForm(String apikey, boolean bool) throws ClientA } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionProcessForm(String apikey, boolean bool) throws ClientApiException { @@ -454,8 +488,9 @@ public ApiResponse setOptionProcessForm(String apikey, boolean bool) throws Clie } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionRequestWaitTime(String apikey, int i) throws ClientApiException { @@ -468,11 +503,13 @@ public ApiResponse setOptionRequestWaitTime(String apikey, int i) throws ClientA } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -482,11 +519,13 @@ public ApiResponse setOptionSendRefererHeader(String apikey, boolean bool) throw } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -496,8 +535,9 @@ public ApiResponse setOptionShowAdvancedDialog(String apikey, boolean bool) thro } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiException { @@ -508,5 +548,4 @@ public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiEx map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionThreadCount", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java index f04e0b9..d15090c 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/StatsDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class StatsDeprecated { @@ -39,8 +36,9 @@ public StatsDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiException { @@ -55,8 +53,9 @@ public ApiResponse clearStats(String apikey, String keyprefix) throws ClientApiE } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionStatsdHost(String apikey, String string) throws ClientApiException { @@ -69,11 +68,13 @@ public ApiResponse setOptionStatsdHost(String apikey, String string) throws Clie } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws ClientApiException { + public ApiResponse setOptionStatsdPrefix(String apikey, String string) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -83,11 +84,13 @@ public ApiResponse setOptionStatsdPrefix(String apikey, String string) throws Cl } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws ClientApiException { + public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -97,8 +100,9 @@ public ApiResponse setOptionInMemoryEnabled(String apikey, boolean bool) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setOptionStatsdPort(String apikey, int i) throws ClientApiException { @@ -109,5 +113,4 @@ public ApiResponse setOptionStatsdPort(String apikey, int i) throws ClientApiExc map.put("Integer", Integer.toString(i)); return api.callApi("stats", "action", "setOptionStatsdPort", map); } - } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java index 1614da3..4932aec 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/UsersDeprecated.java @@ -21,14 +21,11 @@ import java.util.HashMap; import java.util.Map; - import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** - * API implementation with deprecated methods, (re)moved from generated class. - */ +/** API implementation with deprecated methods, (re)moved from generated class. */ @SuppressWarnings("javadoc") public class UsersDeprecated { @@ -39,11 +36,13 @@ public UsersDeprecated(ClientApi api) { } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse newUser(String apikey, String contextid, String name) throws ClientApiException { + public ApiResponse newUser(String apikey, String contextid, String name) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -54,11 +53,13 @@ public ApiResponse newUser(String apikey, String contextid, String name) throws } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse removeUser(String apikey, String contextid, String userid) throws ClientApiException { + public ApiResponse removeUser(String apikey, String contextid, String userid) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -69,11 +70,13 @@ public ApiResponse removeUser(String apikey, String contextid, String userid) th } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setUserEnabled(String apikey, String contextid, String userid, String enabled) + public ApiResponse setUserEnabled( + String apikey, String contextid, String userid, String enabled) throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { @@ -86,11 +89,13 @@ public ApiResponse setUserEnabled(String apikey, String contextid, String userid } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated - public ApiResponse setUserName(String apikey, String contextid, String userid, String name) throws ClientApiException { + public ApiResponse setUserName(String apikey, String contextid, String userid, String name) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -102,15 +107,14 @@ public ApiResponse setUserName(String apikey, String contextid, String userid, S } /** - * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} constructors that allow to - * set the API key (e.g. {@link ClientApi#ClientApi(String, int, String)}). + * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} + * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, + * String)}). */ @Deprecated public ApiResponse setAuthenticationCredentials( - String apikey, - String contextid, - String userid, - String authcredentialsconfigparams) throws ClientApiException { + String apikey, String contextid, String userid, String authcredentialsconfigparams) + throws ClientApiException { Map map = new HashMap<>(); if (apikey != null) { map.put("apikey", apikey); @@ -122,5 +126,4 @@ public ApiResponse setAuthenticationCredentials( } return api.callApi("users", "action", "setAuthenticationCredentials", map); } - } From e27ca128c271f54a3474858ac8d86a75dd653a07 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 27 Mar 2018 10:28:14 +0100 Subject: [PATCH 051/148] Explicitly disable HTTP cache in ClientApi Change the ClientApi to disable the HTTP cache, while the API responses shouldn't be cached it seems they were, sometimes, which broke some use cases (e.g. poll the status of a scan). Related to zaproxy/zaproxy#4462 - ZAP Jenkins plugin does not obtain latest spider status --- CHANGES.md | 3 +++ .../src/main/java/org/zaproxy/clientapi/core/ClientApi.java | 1 + 2 files changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index c816caf..15a538f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,9 @@ Summary of the changes done in each version. ## 1.6.0 (Not yet released) +### Changes + + - Explicitly disable HTTP caching, to always obtain a fresh response from ZAP. ## 1.5.0 (2017-11-30) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index d5d9f43..7549e38 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -351,6 +351,7 @@ private Document callApiDom( private InputStream getConnectionInputStream(HttpRequest request) throws IOException { HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); + uc.setUseCaches(false); for (Entry header : request.getHeaders().entrySet()) { uc.setRequestProperty(header.getKey(), header.getValue()); } From 324d0e8bdbd510017255c223a269fcaec9b1f11e Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 4 Apr 2018 19:05:09 +0100 Subject: [PATCH 052/148] Add websocket API Add the API of WebSockets add-on (version 15). --- CHANGES.md | 4 + .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/Websocket.java | 101 ++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java diff --git a/CHANGES.md b/CHANGES.md index 15a538f..fb2ac2f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,10 @@ Summary of the changes done in each version. - Explicitly disable HTTP caching, to always obtain a fresh response from ZAP. +### New APIs + + - WebSockets ("websocket"). + ## 1.5.0 (2017-11-30) ### Updated APIs diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 7549e38..2531d59 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -72,6 +72,7 @@ import org.zaproxy.clientapi.gen.Spider; import org.zaproxy.clientapi.gen.Stats; import org.zaproxy.clientapi.gen.Users; +import org.zaproxy.clientapi.gen.Websocket; public class ClientApi { @@ -117,6 +118,7 @@ public class ClientApi { public Spider spider = new Spider(this); public Stats stats = new Stats(this); public Users users = new Users(this); + public Websocket websocket = new Websocket(this); public ClientApi(String zapAddress, int zapPort) { this(zapAddress, zapPort, false); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java new file mode 100644 index 0000000..37072b2 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java @@ -0,0 +1,101 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Websocket { + + private final ClientApi api; + + public Websocket(ClientApi api) { + this.api = api; + } + + /** + * Returns all of the registered web socket channels + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse channels() throws ClientApiException { + return api.callApi("websocket", "view", "channels", null); + } + + /** + * Returns full details of the message specified by the channelId and messageId + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse message(String channelid, String messageid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("channelId", channelid); + map.put("messageId", messageid); + return api.callApi("websocket", "view", "message", map); + } + + /** + * Returns a list of all of the messages that meet the given criteria (all optional), where + * channelId is a channel identifier, start is the offset to start returning messages from + * (starting from 0), count is the number of messages to return (default no limit) and + * payloadPreviewLength is the maximum number bytes to return for the payload contents + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse messages( + String channelid, String start, String count, String payloadpreviewlength) + throws ClientApiException { + Map map = new HashMap<>(); + if (channelid != null) { + map.put("channelId", channelid); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + if (payloadpreviewlength != null) { + map.put("payloadPreviewLength", payloadpreviewlength); + } + return api.callApi("websocket", "view", "messages", map); + } + + /** + * Sends the specified message on the channel specified by channelId, if outgoing is 'True' then + * the message will be sent to the server and if it is 'False' then it will be sent to the + * client + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse sendTextMessage(String channelid, String outgoing, String message) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("channelId", channelid); + map.put("outgoing", outgoing); + map.put("message", message); + return api.callApi("websocket", "action", "sendTextMessage", map); + } +} From e92a4f33fdface17c4cd5cf763f4bf3d7c78eca8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 10 Apr 2018 14:57:28 +0100 Subject: [PATCH 053/148] Bump version number to 1.6.0 --- CHANGES.md | 2 +- README.md | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index fb2ac2f..c48eba7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,7 +2,7 @@ Summary of the changes done in each version. -## 1.6.0 (Not yet released) +## 1.6.0 (2018-04-10) ### Changes diff --git a/README.md b/README.md index 9d6b293..a7b9652 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ can be obtained from [Maven Central](http://search.maven.org/) with following co * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.5.0` + * Version: `1.6.0` Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). diff --git a/build.gradle b/build.gradle index 3f6a4a0..5534a71 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ subprojects { group = 'org.zaproxy' - version '1.6.0-SNAPSHOT' + version '1.6.0' ext.versionBC = '1.5.0' repositories { From a121b1864c6be04f3a8a1e6ff51899e2656778be Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 10 Apr 2018 15:00:09 +0100 Subject: [PATCH 054/148] Bump version number to 1.7.0-SNAPSHOT --- CHANGES.md | 2 ++ build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c48eba7..b7ef0b2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ Summary of the changes done in each version. +## 1.7.0-SNAPSHOT (Not yet released) + ## 1.6.0 (2018-04-10) ### Changes diff --git a/build.gradle b/build.gradle index 5534a71..ad576a1 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ subprojects { group = 'org.zaproxy' - version '1.6.0' - ext.versionBC = '1.5.0' + version '1.7.0-SNAPSHOT' + ext.versionBC = '1.6.0' repositories { mavenLocal() From 3bdf087a9b3637c3c61e4228ffa444de6ee3b336 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 16 Apr 2018 09:52:32 +0100 Subject: [PATCH 055/148] Revamp CHANGELOG Rename it (from CHANGES to CHANGELOG) and update it to follow the guidelines from Keep a Changelog. --- CHANGELOG.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ CHANGES.md | 92 ------------------------------------------------- 2 files changed, 97 insertions(+), 92 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 CHANGES.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..031833c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,97 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [1.6.0] - 2018-04-10 +### Added +- WebSockets ("websocket"). + +### Fixed +- Explicitly disable HTTP caching, to always obtain a fresh response from ZAP. + +## [1.5.0] - 2017-11-30 +### Updated +- Core APIs updated for ZAP version 2.7.0. + +## [1.4.0] - 2017-07-13 +### Added +- New Ant task to create ZAP reports: + ```XML + + + + + + ``` + +## [1.3.0] - 2017-06-23 +### Added +- Import files containing URLs ("importurls"). +- OpenAPI Support ("openapi"). +- Replacer ("replacer"). + +### Changed +- Update scan Ant tasks to wait for the corresponding scan to finish. + +## [1.2.0] - 2017-03-29 +### Changed +- Core APIs updated for ZAP version 2.6.0. +- Update AJAX Spider API + - Allows to obtain the full results of a scan, messages in/out of scope + and message with I/O errors. + +## [1.1.1] - 2017-03-09 +### Fixed +- Fixed a bug that prevented the new API methods (that don't require +the API key) from being used with ZAP versions <= 2.5.0. + +## [1.1.0] - 2017-03-09 +### Added +- Context Alert Filters API, for more information refer to the help page: +https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAlertFiltersAlertFilter +- The `Alert` now exposes the alert ID, message ID, and scanner ID. +- Added confidence "False Positive" (enum `Alert.Confidence`). + +### Changed +- The `ClientApi` now allows to set the API key through the constructor, +which ensures that the API key is sent whenever required. +- It's now possible to obtain the keys of the values of an `ApiResponseSet` +(also, deprecated unused/unnecessary constructor and method). +- It's now possible to specify the API key in all Ant tasks. +- Update AJAX Spider API + - Allows to scan a context, as a user and just a subtree. +- Update Selenium API + - Allows to choose which Firefox binary is used and set the path to geckodriver. + +### Deprecated + - The API methods that allowed to pass the API key were deprecated in +favour of using the new `ClientApi` constructor. +- `Alert` and `AlertTask` now use `name` instead of `alert` for the name +of the alert (zaproxy/zaproxy#1341), older methods were deprecated. + +### Fixed +- `ApiResponseSet` now has as values `ApiResponse` (zaproxy/zaproxy#3228). + +## [1.0.0] - 2016-06-03 +### Added + - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) + and released to Maven Central. + +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...HEAD +[1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/zaproxy/zap-api-java/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/zaproxy/zap-api-java/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/zaproxy/zap-api-java/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/zaproxy/zap-api-java/compare/v1.1.1...v1.2.0 +[1.1.1]: https://github.com/zaproxy/zap-api-java/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/zaproxy/zap-api-java/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/zaproxy/zap-api-java/compare/6c778f77a817e1ff71e9279e4759535d482e8393...v1.0.0 \ No newline at end of file diff --git a/CHANGES.md b/CHANGES.md deleted file mode 100644 index b7ef0b2..0000000 --- a/CHANGES.md +++ /dev/null @@ -1,92 +0,0 @@ -# Change Log - -Summary of the changes done in each version. - -## 1.7.0-SNAPSHOT (Not yet released) - -## 1.6.0 (2018-04-10) - -### Changes - - - Explicitly disable HTTP caching, to always obtain a fresh response from ZAP. - -### New APIs - - - WebSockets ("websocket"). - -## 1.5.0 (2017-11-30) - -### Updated APIs - - - Core APIs updated for ZAP version 2.7.0. - -## 1.4.0 (2017-07-13) - -### Ant Tasks - - - New task to create ZAP reports: - ```XML - - - - - - ``` - -## 1.3.0 (2017-06-23) - -### New APIs - - - Import files containing URLs ("importurls"). - - OpenAPI Support ("openapi"). - - Replacer ("replacer"). - -### Ant Tasks - - - Update scan tasks to wait for the corresponding scan to finish. - -## 1.2.0 (2017-03-29) - -### Updated APIs - - - Core APIs updated for ZAP version 2.6.0. - - AJAX Spider API - - Allows to obtain the full results of a scan, messages in/out of scope and message with I/O errors. - -## 1.1.1 (2017-03-09) - -### Bug Fixes - - Fixed a bug that prevented the new API methods (that don't require the API key) from being used with ZAP versions <= 2.5.0. - -## 1.1.0 (2017-03-09) - -### Enhancements - - The `ClientApi` now allows to set the API key through the constructor, which ensures that the API key is sent whenever required. The API methods that allowed to pass the API key were deprecated in favour of using the new constructor. - - It's now possible to specify the API key in all Ant tasks. - - It's now possible to obtain the keys of the values of an `ApiResponseSet` (also, deprecated unused/unnecessary constructor and method). - - The `Alert` now exposes the alert ID, message ID and scanner ID. - - Added confidence "False Positive" (enum `Alert.Confidence`). - - `Alert` and `AlertTask` now use `name` instead of `alert` for the name of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - -### Bug Fixes - - `ApiResponseSet` now has as values `ApiResponse` (zaproxy/zaproxy#3228). - -### New APIs - - - Context Alert Filters API, for more information refer to the help page: https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAlertFiltersAlertFilter - -### Updated APIs - - - AJAX Spider API - - Allows to scan a context, as a user and just a subtree. - - Selenium API - - Allows to choose which Firefox binary is used and set the path to geckodriver. - -## 1.0.0 (2016-06-03) - -First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. From 7a97f14e6ea128ff114fe010884cb3ad5be68f15 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 16 Apr 2018 15:27:45 +0100 Subject: [PATCH 056/148] Move release notes to its own file Move the release notes from README to RELEASING, the release notes are not of relevance for most users. --- README.md | 84 ---------------------------------------------------- RELEASING.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 84 deletions(-) create mode 100644 RELEASING.md diff --git a/README.md b/README.md index a7b9652..2ad612b 100644 --- a/README.md +++ b/README.md @@ -53,87 +53,3 @@ To install the artifacts to the local Maven repository you can run the following ./gradlew install The installed artifacts (`zap-clientapi`) are then available for other (local) projects to use. - -## Releasing - -In the following sections it will be explained the steps necessary to release a new version of the libraries. In all steps the -version to be released is referred to as ``, which should be replaced with appropriate version number -(e.g. 2.1.0). - -### Release Branching - -The project follows the [git-flow branching model](http://nvie.com/posts/a-successful-git-branching-model/). To release a new version it needs to be created a new release branch, update the version, and tag: - 1. Create a release branch: - `git checkout -b release- develop`; - 2. Update version in: - 1. `build.gradle` file (e.g. remove `-SNAPSHOT`); - 2. source code (e.g. `@since` and `@deprecated` JavaDoc tags); - 3. `README.md` file (in `How to Obtain` section); - 3. Review that everything is correct and commit the changes: - `git commit -S -m "Bump version number to "` - 4. Checkout `master` and merge the release branch: - 1. `git checkout master` - 2. `git merge -S --no-ff release- -m "Merge branch 'release-' into master"` - 5. Tag the new version: - `git tag -s v -m "Version "` - -Reintegrate the changes into `develop` branch: - 1. Checkout develop branch: - `git checkout develop` - 2. Merge the `release-` branch: - `git merge -S --no-ff release- -m "Merge branch 'release-' into develop"` - 1. Resolve possible conflicts; - 1. The version can be bumped to the next developing version (e.g. increase the minor version and add `-SNAPSHOT`); - 2. Continue with the merge (if the version was bumped mention it in the commit message); - 3. Bump to the next developing version now (e.g. increase the minor version and add `-SNAPSHOT`), if not done during the merge: - `git commit -S -m "Bump version number to -SNAPSHOT"` - -Delete the release branch: - - git branch -d release- - -Push the branches (`develop` and `master`) and tag: - - git push upstream develop master v - -(Assuming `upstream` is the zaproxy repo.) - -### Build for Release - -Checkout the tagged version: - - git checkout v - -Create the artifacts/libraries necessary for the release: - - ./gradlew clean build - -### Release to Maven Central - -To upload the built artifacts to OSSRH you can run the following: - - ./gradlew uploadArchives - -Once uploaded continue with the release process in OSSRH: -http://central.sonatype.org/pages/releasing-the-deployment.html - -NOTE: The following properties must be defined (e.g. in file `GRADLE_HOME/gradle.properties` ) to successfully sign and -upload the artifacts: - - `signing.keyId` - the ID of the GPG key, used to sign the artifacts; - - `ossrhUsername` - the OSSRH username; - - `ossrhPassword` - the OSSRH password for above username. - -Also, the user must have permissions to upload to GroupId `org.zaproxy`. - -### GitHub Release - -Release in GitHub: - 1. Draft a [new release](https://github.com/zaproxy/zap-api-java/releases/new): - - Tag: `v` - - Title: `Version ` - - Description: (Add a summary of the changes done in the new version and mention the artifacts/libraries available.) - 2. Upload the libraries: - - `zap-api-.jar` - - `zap-clientapi-.jar` - - `zap-clientapi-ant-.jar` - 3. Publish release. diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 0000000..18d7a76 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,83 @@ +## Releasing + +In the following sections it will be explained the steps necessary to release a new version of the libraries. In all steps the +version to be released is referred to as ``, which should be replaced with appropriate version number +(e.g. 2.1.0). + +### Release Branching + +The project follows the [git-flow branching model](http://nvie.com/posts/a-successful-git-branching-model/). To release a new version it needs to be created a new release branch, update the version, and tag: + 1. Create a release branch: + `git checkout -b release- develop`; + 2. Update version in: + 1. `build.gradle` file (e.g. remove `-SNAPSHOT`); + 2. source code (e.g. `@since` and `@deprecated` JavaDoc tags); + 3. `README.md` file (in `How to Obtain` section); + 3. Review that everything is correct and commit the changes: + `git commit -S -m "Bump version number to "` + 4. Checkout `master` and merge the release branch: + 1. `git checkout master` + 2. `git merge -S --no-ff release- -m "Merge branch 'release-' into master"` + 5. Tag the new version: + `git tag -s v -m "Version "` + +Reintegrate the changes into `develop` branch: + 1. Checkout develop branch: + `git checkout develop` + 2. Merge the `release-` branch: + `git merge -S --no-ff release- -m "Merge branch 'release-' into develop"` + 1. Resolve possible conflicts; + 1. The version can be bumped to the next developing version (e.g. increase the minor version and add `-SNAPSHOT`); + 2. Continue with the merge (if the version was bumped mention it in the commit message); + 3. Bump to the next developing version now (e.g. increase the minor version and add `-SNAPSHOT`), if not done during the merge: + `git commit -S -m "Bump version number to -SNAPSHOT"` + +Delete the release branch: + + git branch -d release- + +Push the branches (`develop` and `master`) and tag: + + git push upstream develop master v + +(Assuming `upstream` is the zaproxy repo.) + +### Build for Release + +Checkout the tagged version: + + git checkout v + +Create the artifacts/libraries necessary for the release: + + ./gradlew clean build + +### Release to Maven Central + +To upload the built artifacts to OSSRH you can run the following: + + ./gradlew uploadArchives + +Once uploaded continue with the release process in OSSRH: +http://central.sonatype.org/pages/releasing-the-deployment.html + +NOTE: The following properties must be defined (e.g. in file `GRADLE_HOME/gradle.properties` ) to successfully sign and +upload the artifacts: + - `signing.keyId` - the ID of the GPG key, used to sign the artifacts; + - `ossrhUsername` - the OSSRH username; + - `ossrhPassword` - the OSSRH password for above username. + +Also, the user must have permissions to upload to GroupId `org.zaproxy`. + +### GitHub Release + +Release in GitHub: + 1. Draft a [new release](https://github.com/zaproxy/zap-api-java/releases/new): + - Tag: `v` + - Title: `Version ` + - Description: (Add a summary of the changes done in the new version and mention the artifacts/libraries available.) + 2. Upload the libraries: + - `zap-api-.jar` + - `zap-clientapi-.jar` + - `zap-clientapi-ant-.jar` + 3. Publish release. From a612deaddc612c6970d273196954338b9dca1d2e Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 24 Apr 2018 18:33:24 +0100 Subject: [PATCH 057/148] Correct form-based authentication example Change FormBasedAuthentication to correct the method used to obtain the data from the API response to compare with correct type (String instead of ApiResponse), which caused the mandatory parameters to be reported as optional. --- .../examples/authentication/FormBasedAuthentication.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java index 44af1ae..b3e72e4 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java @@ -90,7 +90,7 @@ private static void listAuthInformation(ClientApi clientApi) throws ClientApiExc + "' config param: " + set.getValue("name") + " (" - + (set.getValue("mandatory").equals("true") + + (set.getStringValue("mandatory").equals("true") ? "mandatory" : "optional") + ")"); @@ -110,7 +110,7 @@ private static void listUserConfigInformation(ClientApi clientApi) throws Client for (ApiResponse r : configParamsList.getItems()) { ApiResponseSet set = (ApiResponseSet) r; sb.append(set.getValue("name")).append(" ("); - sb.append((set.getValue("mandatory").equals("true") ? "mandatory" : "optional")); + sb.append((set.getStringValue("mandatory").equals("true") ? "mandatory" : "optional")); sb.append("), "); } System.out.println(sb.deleteCharAt(sb.length() - 2).toString()); From 69add208cfcf8a5c6af45fa840d155dcc2a2f16a Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 10 May 2018 23:43:16 +0100 Subject: [PATCH 058/148] Update Gradle and plugin Update Gradle to 4.7. Update OWASP Dependency-Check plugin to 3.1.2. Address deprecation warning in japicmp task. Remove unnecessary sourceset declaration in the Ant library, the example is provided through the build.xml file not Java code. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 54333 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../zap-clientapi-ant.gradle | 2 -- .../zap-clientapi/zap-clientapi.gradle | 4 ++-- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index ad576a1..9740712 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } task wrapper(type: Wrapper) { - gradleVersion = '4.6' + gradleVersion = '4.7' } apply from: "gradle/compile.gradle" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c44b679acd3f794ddbb3aa5e919244914911014a..91ca28c8b802289c3a438766657a5e98f20eff03 100644 GIT binary patch delta 7643 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ea720f9..16d2805 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index 7bfc6fc..d3fc12e 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -7,8 +7,6 @@ dependencies { testCompile 'org.nanohttpd:nanohttpd:2.3.1' } -sourceSets { examples } - jar { manifest { attributes 'Implementation-Title': 'OWASP ZAP Ant API Client', diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 992be58..20bc491 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,6 +1,6 @@ plugins { id "me.champeau.gradle.japicmp" version "0.2.6" - id "org.owasp.dependencycheck" version "3.1.1" + id "org.owasp.dependencycheck" version "3.1.2" } apply plugin: 'maven' @@ -37,7 +37,7 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { if (!JavaVersion.current().isJava9Compatible()) { check.dependsOn 'japicmp' } - inputs.file(jar) + inputs.files(jar) oldClasspath = configurations.japicmpBaseline newClasspath = configurations.runtime + files(jar) From 7f250b828b6f79735fc27f4e023c1985d90990ad Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 10 May 2018 23:43:49 +0100 Subject: [PATCH 059/148] Migrate to java-library plugin The java-library plugin gives more control on how the dependencies are exposed to consumers of the API client, update dependency declarations accordingly. --- build.gradle | 2 +- subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle | 6 +++--- subprojects/zap-clientapi/zap-clientapi.gradle | 7 +++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index ad576a1..20bf384 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ task wrapper(type: Wrapper) { apply from: "gradle/compile.gradle" subprojects { - apply plugin: 'java' + apply plugin: 'java-library' apply plugin: 'com.diffplug.gradle.spotless' group = 'org.zaproxy' diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index 7bfc6fc..93a12e5 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -1,10 +1,10 @@ dependencies { - compile project(':zap-clientapi') + implementation project(':zap-clientapi') compileOnly 'org.apache.ant:ant:1.9.7' - testCompile 'org.apache.ant:ant-testutil:1.9.7' - testCompile 'org.nanohttpd:nanohttpd:2.3.1' + testImplementation 'org.apache.ant:ant-testutil:1.9.7' + testImplementation 'org.nanohttpd:nanohttpd:2.3.1' } sourceSets { examples } diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 992be58..1045ee3 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -6,7 +6,10 @@ plugins { apply plugin: 'maven' apply plugin: 'signing' -dependencies { compile 'org.jdom:jdom:1.1.3' } +dependencies { + // XXX Change to implementation (it's not exposed in public API) when bumping major version. + api 'org.jdom:jdom:1.1.3' +} sourceSets { examples } @@ -40,7 +43,7 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { inputs.file(jar) oldClasspath = configurations.japicmpBaseline - newClasspath = configurations.runtime + files(jar) + newClasspath = configurations.runtimeClasspath + files(jar) onlyBinaryIncompatibleModified = true failOnModification = true ignoreMissingClasses = true From c0a70ab8283a05391980a997916b40fb26e43b1b Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 16 May 2018 23:46:47 +0100 Subject: [PATCH 060/148] Address Gradle deprecation Address deprecation by using default wrapper task. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a21aca2..e28da44 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id "com.diffplug.gradle.spotless" version "3.10.0" apply false } -task wrapper(type: Wrapper) { +wrapper { gradleVersion = '4.7' } From 94c28ecba08c64067960a12a54e44e226246f5e0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 17 May 2018 23:28:43 +0100 Subject: [PATCH 061/148] Fix configuration of examples sourceset Configure examples sourceset to use the main sourceset and ensure the examples are compiled. --- subprojects/zap-clientapi/zap-clientapi.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 2417eba..02a69cc 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -6,12 +6,16 @@ plugins { apply plugin: 'maven' apply plugin: 'signing' +sourceSets { examples } + +assemble.dependsOn examplesClasses + dependencies { // XXX Change to implementation (it's not exposed in public API) when bumping major version. api 'org.jdom:jdom:1.1.3' -} -sourceSets { examples } + examplesImplementation sourceSets.main.output +} jar { manifest { From 340ffb96f21b935dcadead468d8a1eef9c7b57af Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 13 Jun 2018 23:26:21 +0100 Subject: [PATCH 062/148] Add Java 10 to Travis CI builds Change .travis.yml to also run the build with Java 10. Add a task/note about why japicmp is not run with newer Java versions. --- .travis.yml | 1 + subprojects/zap-clientapi/zap-clientapi.gradle | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5eae43d..e950b98 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ sudo: false jdk: - oraclejdk8 - oraclejdk9 + - oraclejdk10 before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 02a69cc..58a04ca 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -41,7 +41,8 @@ dependencyCheck { task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { group 'verification' description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." - if (!JavaVersion.current().isJava9Compatible()) { + // XXX Don't run by default with Java 9+, does not work (needs the module java.xml.bind). + if (JavaVersion.current() == JavaVersion.VERSION_1_8) { check.dependsOn 'japicmp' } inputs.files(jar) From ea5422f35010679edbb6297063fcbfbce66bad7b Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 26 Jun 2018 23:37:45 +0100 Subject: [PATCH 063/148] Update Gradle and move to Maven Publish Plugin Update Gradle to 4.8.1, change to use Maven Publish Plugin (instead of Maven Plugin, which is superseded), and remove unnecessary task generatePom, the publish plugin already provides a task to generate it. Update OWASP Dependency-Check plugin to 3.2.1 and Spotless to 3.13.0. Update RELEASING.md with the new task to publish the artifacts. --- RELEASING.md | 2 +- build.gradle | 5 +- gradle/wrapper/gradle-wrapper.jar | Bin 54413 -> 54417 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 + .../zap-clientapi/zap-clientapi.gradle | 149 ++++++++---------- 6 files changed, 74 insertions(+), 86 deletions(-) diff --git a/RELEASING.md b/RELEASING.md index 18d7a76..6a1784e 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -56,7 +56,7 @@ Create the artifacts/libraries necessary for the release: To upload the built artifacts to OSSRH you can run the following: - ./gradlew uploadArchives + ./gradlew publish Once uploaded continue with the release process in OSSRH: http://central.sonatype.org/pages/releasing-the-deployment.html diff --git a/build.gradle b/build.gradle index e28da44..c79bfab 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,10 @@ plugins { - id "com.diffplug.gradle.spotless" version "3.10.0" apply false + id "com.diffplug.gradle.spotless" version "3.13.0" apply false } wrapper { - gradleVersion = '4.7' + gradleVersion = '4.8.1' + distributionType = Wrapper.DistributionType.ALL } apply from: "gradle/compile.gradle" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 91ca28c8b802289c3a438766657a5e98f20eff03..758de960ec7947253b058ff79c88ce51f3abe08a 100644 GIT binary patch delta 676 zcmYk)T}V@590u^ce`_BwX;Cw`SqsGrC&`wT8k1(Ggu_`V=0Gr_sZh~0XniU|SEl89 zY#?Y-Hzi$2m>0E5*V*Pi)H!E2MPPJO3=H!&qSu#Y9XOod^SuA}a1Q4TPGor}vWCi3 zGZ)U+R>@?tX0NSL>HMbq*}dM)5O5h@ygdD0JGE50O?JwzP+lLZZqxFyUHpVs%EKY4 z_}^Z1N{wt3ZzKzw#hO&k(&&=spfYHpeGFg1TJ!`@P>Wn}UZuo+xf0*`s#UR7T~X*@ z51D98C8~i?Ii>e(t$q#J=u@tUN5gg0Z{##!#<&|DaScLYJ+ojne1?n%#EfIEf>b4f zk2nVo3$D$TQR<|iHFAX7?SkX=+3-bs}Sd6CKkkC%t{+BWVe^%cg#dRot!#U#~oB~2?1{&CgWA?71ra;q;rd+ z!L8nXAwpcHhSvitia_(4Wh#uHUEy8?gd=$3`dzo@G6yr|{XIkLhJINq)`}@n(f7J&VGY i>R@AdmTG5i>{vNy`2TOp{reo^8bIqxu{=-O41WNHN*rSV delta 734 zcmYk4?MqWp9LINl(x&CZEs?G3QZyo*xYXDh88%8PlyqT9ltqwPLKE>t(g;HEMP$~t z?}(NU3&CK~8xib5D%*o|o14!0BHvhVB81*pe}J71x3vq0`}v&jxtH%b_qzN!BmNxc zk-TSJFT=-GD%E+HwO!-=-M`h(R8Dz%_FSO&utsHT(d6DQ#85F`v6~NfNDoV}`u|h7 z9c*XMF(0gBAMq<_VVf9i(c(m?iu4T5XbIYwjIoe`I@Cg);aq$V)zeW;M$O@qG@7TV zg*LUBpG#03(fSPT%d2Ei4IjNsCGvhXkU#mTTKxr!V-+x(ZktUh~|`p z12LIhhc#wn0k~qv*cOtpt90)cin{mWbi9=+>_`pkaoMg#EN-ATy+S+V zB=G%^9vevm%?xvG#4BF+;<8NBk43uSRbzbFN>i?k{&Y!VQ*lprvpG*@fqkWc-ab_{ zAL}c%H0~8@Or4@TV*6>g6uhZSs8^EJL1x#yFY4*>k`}c*#{S&UORjYNuzw!r5nIvKW diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 16d2805..debd024 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 3530632..f92ef68 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,6 +18,8 @@ * limitations under the License. */ +enableFeaturePreview('STABLE_PUBLISHING') + include 'zap-clientapi' include 'zap-clientapi-ant' diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 58a04ca..ae78359 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,11 +1,10 @@ plugins { + id "maven-publish" + id "signing" id "me.champeau.gradle.japicmp" version "0.2.6" - id "org.owasp.dependencycheck" version "3.1.2" + id "org.owasp.dependencycheck" version "3.2.1" } -apply plugin: 'maven' -apply plugin: 'signing' - sourceSets { examples } assemble.dependsOn examplesClasses @@ -82,94 +81,80 @@ task uberJar(type: Jar) { build.dependsOn 'uberJar' -artifacts { archives sourcesJar, javadocJar } - -signing { - if (project.hasProperty('signing.keyId')) { - sign configurations.archives - } -} - -ext.pomData = pom { - project { - name 'OWASP ZAP API Client' - packaging 'jar' - description 'Java implementation to access OWASP ZAP API.' - url 'https://github.com/zaproxy/zap-api-java' - - organization { - name 'OWASP' - url 'https://www.owasp.org/index.php/ZAP' - } - - mailingLists { - mailingList { - name 'OWASP ZAP User Group' - post 'zaproxy-users@googlegroups.com' - archive 'https://groups.google.com/group/zaproxy-users' - } - mailingList { - name 'OWASP ZAP Developer Group' - post 'zaproxy-develop@googlegroups.com' - archive 'https://groups.google.com/group/zaproxy-develop' - } - } - - scm { - url 'https://github.com/zaproxy/zap-api-java' - connection 'scm:git:https://github.com/zaproxy/zap-api-java.git' - developerConnection 'scm:git:https://github.com/zaproxy/zap-api-java.git' - } - - licenses { - license { - name 'The Apache License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - - developers { - developer { - id 'psiinon' - name 'Simon Bennetts' - email 'psiinon@gmail.com' +publishing { + repositories { + maven { + def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" + url version.endsWith("SNAPSHOT") ? snapshotsRepoUrl : releasesRepoUrl + + if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { + credentials { + username = ossrhUsername + password = ossrhPassword + } } } } -} -task generatePom { - description 'Generates the POM file.' - pomData.writeTo("$buildDir/pom.xml") -} + publications { + clientApi(MavenPublication) { + from components.java + + artifact sourcesJar + artifact javadocJar + + pom { + name = 'OWASP ZAP API Client' + description = 'Java implementation to access OWASP ZAP API.' + url = 'https://github.com/zaproxy/zap-api-java' + + organization { + name = 'OWASP' + url = 'https://www.owasp.org/index.php/ZAP' + } -install { - repositories.mavenInstaller { - pom = pomData - } -} + mailingLists { + mailingList { + name = 'OWASP ZAP User Group' + post = 'zaproxy-users@googlegroups.com' + archive = 'https://groups.google.com/group/zaproxy-users' + } + mailingList { + name = 'OWASP ZAP Developer Group' + post = 'zaproxy-develop@googlegroups.com' + archive = 'https://groups.google.com/group/zaproxy-develop' + } + } -uploadArchives { - repositories { - mavenDeployer { - beforeDeployment { MavenDeployment deployment -> - signing.signPom(deployment) - } + scm { + url = 'https://github.com/zaproxy/zap-api-java' + connection = 'scm:git:https://github.com/zaproxy/zap-api-java.git' + developerConnection = 'scm:git:https://github.com/zaproxy/zap-api-java.git' + } - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { - authentication(userName: ossrhUsername, password: ossrhPassword) + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution = 'repo' + } } - } - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { - authentication(userName: ossrhUsername, password: ossrhPassword) + developers { + developer { + id = 'psiinon' + name = 'Simon Bennetts' + email = 'psiinon@gmail.com' + } } } - - pom = pomData } } -} \ No newline at end of file +} + +signing { + if (project.hasProperty('signing.keyId')) { + sign publishing.publications.clientApi + } +} From a374d9384611e0249653a524a1da7bc30083826d Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 19 Jul 2018 16:35:40 +0100 Subject: [PATCH 064/148] Add Java 11 to Travis CI builds Change .travis.yml to run the build with Java 11, also, remove Java 9 and 10 as they will be soon superseded by Java 11. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e950b98..521f1d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,7 @@ sudo: false jdk: - oraclejdk8 - - oraclejdk9 - - oraclejdk10 + - openjdk11 before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock From 4b5c904416da0d49c888325c528b60340447d202 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 7 Aug 2018 18:12:52 +0100 Subject: [PATCH 065/148] Fix misc issues Change ClientApi to disable XXE processing (same as in ZAP) when parsing ZAP API responses, not needed. Change AlertsFile to close the file with try-with-resource statement to ensure it is always closed. Update CHANGELOG.md. Issues reported by `lgtm.com`. --- CHANGELOG.md | 3 ++ .../zaproxy/clientapi/core/AlertsFile.java | 7 +++-- .../org/zaproxy/clientapi/core/ClientApi.java | 30 ++++++++++++++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 031833c..8782f20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- Disable XXE processing when parsing ZAP API responses. +- Ensure alerts file is always closed. ## [1.6.0] - 2018-04-10 ### Added diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index 8654f75..45fae8d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -20,8 +20,9 @@ package org.zaproxy.clientapi.core; import java.io.File; -import java.io.FileWriter; import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import org.jdom.Document; @@ -77,8 +78,8 @@ private static void writeAlertsToFile(File outputFile, Document doc) { XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); - try { - xmlOutput.output(doc, new FileWriter(outputFile)); + try (OutputStream os = Files.newOutputStream(outputFile.toPath())) { + xmlOutput.output(doc, os); System.out.println("alert xml report saved to: " + outputFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 2531d59..5da9991 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -44,6 +44,7 @@ import java.util.concurrent.TimeUnit; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.zaproxy.clientapi.gen.Acsrf; import org.zaproxy.clientapi.gen.AjaxSpider; @@ -90,6 +91,8 @@ public class ClientApi { private final String apiKey; + private DocumentBuilderFactory docBuilderFactory; + // Note that any new API implementations added have to be added here manually public Acsrf acsrf = new Acsrf(this); public AjaxSpider ajaxSpider = new AjaxSpider(this); @@ -340,10 +343,7 @@ private Document callApiDom( if (debug) { debugStream.println("Open URL: " + request.getRequestUri()); } - // get the factory - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - // Using factory get an instance of document builder - DocumentBuilder db = dbf.newDocumentBuilder(); + DocumentBuilder db = getDocumentBuilderFactory().newDocumentBuilder(); // parse using builder to get DOM representation of the XML file return db.parse(getConnectionInputStream(request)); } catch (Exception e) { @@ -351,6 +351,28 @@ private Document callApiDom( } } + /** + * Gets the {@code DocumentBuilderFactory} instance with XML External Entity (XXE) processing + * disabled. + * + * @return the {@code DocumentBuilderFactory} instance with XXE processing disabled. + * @throws ParserConfigurationException if an error occurred while disabling XXE processing. + * @see DocumentBuilderFactory + */ + private DocumentBuilderFactory getDocumentBuilderFactory() throws ParserConfigurationException { + if (docBuilderFactory == null) { + // Disable XXE processing, not required by default. + // https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + factory.setExpandEntityReferences(false); + docBuilderFactory = factory; + } + return docBuilderFactory; + } + private InputStream getConnectionInputStream(HttpRequest request) throws IOException { HttpURLConnection uc = (HttpURLConnection) request.getRequestUri().openConnection(proxy); uc.setUseCaches(false); From ae5490ea4694b8676a3c2e434cffe078b0e071b9 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 9 Aug 2018 23:42:49 +0100 Subject: [PATCH 066/148] Tweaks in README Update link to search in Maven Central, now using query parameters. Add mention to Gradle. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2ad612b..a1a5ea1 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,14 @@ This project produces two libraries: The latest released versions can be downloaded from the [Releases page](https://github.com/zaproxy/zap-api-java/releases). -Or, if using a dependency management tool, for example [Maven](https://maven.apache.org/), the `zap-clientapi` library +Or, if using a dependency management tool, for example [Maven](https://maven.apache.org/) or [Gradle](https://gradle.org/), the `zap-clientapi` library can be obtained from [Maven Central](http://search.maven.org/) with following coordinates: * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` * Version: `1.6.0` -Previous releases are also available, more details can be found in [Maven Central](http://search.maven.org/#search|ga|1|org.zaproxy). +Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). ## Getting Help From 7b73c5b4843c4f392fccc03c938e94f4a2af06a8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 10 Aug 2018 11:27:06 +0100 Subject: [PATCH 067/148] Remove unused class Remove unused manual test class. --- .../org/zaproxy/clientapi/examples/Test.java | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java deleted file mode 100644 index 9cd89c1..0000000 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/Test.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.examples; - -import java.util.ArrayList; -import java.util.List; -import org.zaproxy.clientapi.core.Alert; -import org.zaproxy.clientapi.core.Alert.Confidence; -import org.zaproxy.clientapi.core.Alert.Risk; -import org.zaproxy.clientapi.core.ClientApi; - -public class Test { - - /** @param args */ - public static void main(String[] args) { - // TODO List - // High priority - // * Start ZAP in background - task still waits! } Need docs? - // * Get checkAlerts to work with inner elements } - // Medium - tidy up - // * Create min zapapi.jar - // * Correct way of installing in Eclipse - // Docs etc - // * Full wave reg test - // * Full wavsep reg test - // * Documentation - // Publicise - // * Blog, tweet etc etc - // * Work out priorities for extending api - // * Complete tasks - more for internal use than anything else - - List ignoreAlerts = new ArrayList<>(2); - ignoreAlerts.add( - new Alert( - "Cookie set without HttpOnly flag", - null, - Risk.Low, - Confidence.Medium, - null, - null)); - ignoreAlerts.add(new Alert(null, null, Risk.Low, Confidence.Medium, null, null)); - - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, null); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - List requireAlerts = new ArrayList<>(1); - // ignoreAlerts.add(new Alert(null, null, null, null, null, null)); - requireAlerts.add(new Alert("Not present", null, Risk.Low, Confidence.Medium, null, null)); - try { - (new ClientApi("localhost", 8090)).checkAlerts(ignoreAlerts, requireAlerts); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } -} From afe9fb02f1895b8d87c4c24c5812c22e748ca70c Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 10 Aug 2018 12:08:49 +0100 Subject: [PATCH 068/148] Don't print exception when saving alerts Change AlertsFile to not print the exception, instead let it be handled by caller code (as it's already doing). Change ClientApi to provide a custom message when failed to save the alerts. --- .../src/main/java/org/zaproxy/clientapi/core/AlertsFile.java | 4 +--- .../src/main/java/org/zaproxy/clientapi/core/ClientApi.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java index 45fae8d..f2a8f2a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/AlertsFile.java @@ -73,7 +73,7 @@ public static void saveAlertsToFile( writeAlertsToFile(outputFile, alertsDocument); } - private static void writeAlertsToFile(File outputFile, Document doc) { + private static void writeAlertsToFile(File outputFile, Document doc) throws IOException { XMLOutputter xmlOutput = new XMLOutputter(); @@ -81,8 +81,6 @@ private static void writeAlertsToFile(File outputFile, Document doc) { try (OutputStream os = Files.newOutputStream(outputFile.toPath())) { xmlOutput.output(doc, os); System.out.println("alert xml report saved to: " + outputFile.getAbsolutePath()); - } catch (IOException e) { - e.printStackTrace(); } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 5da9991..b8ec074 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -230,7 +230,7 @@ public void checkAlerts(List ignoreAlerts, List requireAlerts, Fil results.get("ignoredAlerts"), outputFile); } catch (Exception e) { - throw new ClientApiException(e); + throw new ClientApiException("Failed to save the alerts:", e); } if (alertsFound > 0 || alertsNotFound > 0) { throw new ClientApiException("Check Alerts Failed!\n" + resultsString); From fe753c117625a8154bc5f0609ba1e974ab6c5358 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 23 Aug 2018 00:55:23 +0100 Subject: [PATCH 069/148] Document why the API requests use hardcoded domain Add JavaDoc to ClientApi.buildZapRequest to explain why the domain is hardcoded. --- .../java/org/zaproxy/clientapi/core/ClientApi.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index b8ec074..a0303ba 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -413,6 +413,20 @@ public byte[] callApiOther( } } + /** + * Builds a request for the ZAP API with the given data. + * + *

As the API client proxies through ZAP the built API requests use a specific domain, {@code + * zap}, to ensure that they are always handled by ZAP (and not forward). + * + * @param format the desired format of the API response (e.g. XML, JSON, other). + * @param component the API component (e.g. core, spider). + * @param type the type of the API endpoint (e.g. action, view). + * @param method the name of the endpoint. + * @param params the parameters for the endpoint. + * @return the API request. + * @throws MalformedURLException if an error occurred while building the URL. + */ private HttpRequest buildZapRequest( String format, String component, String type, String method, Map params) throws MalformedURLException { From 26b92b404d4be1dd999a73185658834f76fd5b82 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 23 Aug 2018 19:18:21 +0100 Subject: [PATCH 070/148] Add Error Prone to build Change build.gradle to use Error Prone when compiling. Address warnings reported by Error Prone: - Add missing fail to BuildTest.shouldExecuteTargetAlertCheck to ensure that the test does not pass if the expected exception is not thrown (MissingFail). - Change SimpleExample to not rely on default charset when writing the report (DefaultCharset). - Change FormBasedAuthentication to use ArrayList instead of LinkedList (JdkObsolete). - Change ClientApi to not rely on default charset when reading the proxied response (DefaultCharset), also, use try-with-resource statement to close the input stream, and normalise case of API key parameters (InconsistentCapitalization). - Change ClientApiMain to split the command line arguments with a limit (StringSplitter) and add a missing case to the tasks' help (MissingCasesInEnumSwitch), also, fix a typo in existing help task. --- build.gradle | 14 ++++++++ .../org/zaproxy/clientapi/ant/BuildTest.java | 2 ++ .../clientapi/examples/SimpleExample.java | 3 +- .../FormBasedAuthentication.java | 4 +-- .../org/zaproxy/clientapi/core/ClientApi.java | 32 +++++++++---------- .../zaproxy/clientapi/core/ClientApiMain.java | 16 +++++++--- 6 files changed, 48 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index c79bfab..f5f3466 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,12 @@ +buildscript { + repositories { + maven { url "https://plugins.gradle.org/m2/" } + } + dependencies { + classpath JavaVersion.current() == JavaVersion.VERSION_1_8 ? "net.ltgt.gradle:gradle-errorprone-plugin:0.0.16" : "net.ltgt.gradle:gradle-errorprone-javacplugin-plugin:0.3" + } +} + plugins { id "com.diffplug.gradle.spotless" version "3.13.0" apply false } @@ -12,6 +21,7 @@ apply from: "gradle/compile.gradle" subprojects { apply plugin: 'java-library' apply plugin: 'com.diffplug.gradle.spotless' + apply plugin: JavaVersion.current() == JavaVersion.VERSION_1_8 ? "net.ltgt.errorprone" : "net.ltgt.errorprone-javacplugin" group = 'org.zaproxy' @@ -33,4 +43,8 @@ subprojects { googleJavaFormat().style('AOSP') } } + + dependencies { + errorprone 'com.google.errorprone:error_prone_core:2.3.1' + } } diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java index 182e200..00d72ec 100644 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java @@ -20,6 +20,7 @@ package org.zaproxy.clientapi.ant; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import fi.iki.elonen.NanoHTTPD; import java.io.File; @@ -126,6 +127,7 @@ public void shouldExecuteTargetActiveScanUrl() { public void shouldExecuteTargetAlertCheck() { try { buildRule.executeTarget("alertCheck"); + fail("Expected BuildException."); } catch (BuildException e) { assertTrue(e.getCause() instanceof ClientApiException); assertTrue(e.getCause().getMessage().startsWith("Not found 1 alerts")); diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 9ec12c1..9300ace 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -19,6 +19,7 @@ */ package org.zaproxy.clientapi.examples; +import java.nio.charset.StandardCharsets; import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ApiResponseElement; import org.zaproxy.clientapi.core.ClientApi; @@ -89,7 +90,7 @@ public static void main(String[] args) { System.out.println("Active Scan complete"); System.out.println("Alerts:"); - System.out.println(new String(api.core.xmlreport())); + System.out.println(new String(api.core.xmlreport(), StandardCharsets.UTF_8)); } catch (Exception e) { System.out.println("Exception : " + e.getMessage()); diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java index b3e72e4..af208d6 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/authentication/FormBasedAuthentication.java @@ -21,7 +21,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ApiResponseElement; @@ -66,7 +66,7 @@ public class FormBasedAuthentication { private static void listAuthInformation(ClientApi clientApi) throws ClientApiException { // Check out which authentication methods are supported by the API - List supportedMethodNames = new LinkedList<>(); + List supportedMethodNames = new ArrayList<>(); ApiResponseList authMethodsList = (ApiResponseList) clientApi.authentication.getSupportedAuthenticationMethods(); for (ApiResponse authMethod : authMethodsList.getItems()) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index b8ec074..d4b1d23 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -35,6 +35,7 @@ import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -305,9 +306,9 @@ private void accessUrlViaProxy(Proxy proxy, String apiurl) throws ClientApiExcep HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy); uc.connect(); - BufferedReader in; - try { - in = new BufferedReader(new InputStreamReader(uc.getInputStream())); + try (BufferedReader in = + new BufferedReader( + new InputStreamReader(uc.getInputStream(), StandardCharsets.UTF_8))) { String inputLine; while ((inputLine = in.readLine()) != null) { @@ -315,7 +316,6 @@ private void accessUrlViaProxy(Proxy proxy, String apiurl) throws ClientApiExcep debugStream.println(inputLine); } } - in.close(); } catch (IOException e) { // Ignore @@ -468,7 +468,7 @@ private static String encodeQueryParam(String param) { /** * Adds the given regular expression to the exclusion list of the given context. * - * @param apikey the API key, might be {@code null}. + * @param apiKey the API key, might be {@code null}. * @param contextName the name of the context. * @param regex the regular expression to add. * @throws Exception if an error occurred while calling the API. @@ -476,15 +476,15 @@ private static String encodeQueryParam(String param) { * @see #context */ @Deprecated - public void addExcludeFromContext(String apikey, String contextName, String regex) + public void addExcludeFromContext(String apiKey, String contextName, String regex) throws Exception { - context.excludeFromContext(apikey, contextName, regex); + context.excludeFromContext(apiKey, contextName, regex); } /** * Adds the given regular expression to the inclusion list of the given context. * - * @param apikey the API key, might be {@code null}. + * @param apiKey the API key, might be {@code null}. * @param contextName the name of the context. * @param regex the regular expression to add. * @throws Exception if an error occurred while calling the API. @@ -492,9 +492,9 @@ public void addExcludeFromContext(String apikey, String contextName, String rege * @see #context */ @Deprecated - public void addIncludeInContext(String apikey, String contextName, String regex) + public void addIncludeInContext(String apiKey, String contextName, String regex) throws Exception { - context.includeInContext(apikey, contextName, regex); + context.includeInContext(apiKey, contextName, regex); } /** @@ -503,21 +503,21 @@ public void addIncludeInContext(String apikey, String contextName, String regex) * *

Nodes that do not match the regular expression are excluded. * - * @param apikey the API key, might be {@code null}. + * @param apiKey the API key, might be {@code null}. * @param contextName the name of the context. * @param regex the regular expression to match the node/URL. * @throws Exception if an error occurred while calling the API. * @deprecated (1.1.0) Use {@link #includeOneMatchingNodeInContext(String, String)} instead. */ @Deprecated - public void includeOneMatchingNodeInContext(String apikey, String contextName, String regex) + public void includeOneMatchingNodeInContext(String apiKey, String contextName, String regex) throws Exception { List sessionUrls = getSessionUrls(); boolean foundOneMatch = false; for (String sessionUrl : sessionUrls) { if (sessionUrl.matches(regex)) { if (foundOneMatch) { - addExcludeFromContext(apikey, contextName, sessionUrl); + addExcludeFromContext(apiKey, contextName, sessionUrl); } else { foundOneMatch = true; } @@ -577,15 +577,15 @@ private List getSessionUrls() throws Exception { * *

The method returns only after the scan has finished. * - * @param apikey the API key, might be {@code null}. + * @param apiKey the API key, might be {@code null}. * @param url the site to scan * @throws Exception if an error occurred while calling the API. * @deprecated (1.1.0) Use {@link #activeScanSiteInScope(String)} instead, the API key should be * set using one of the {@code ClientApi} constructors. */ @Deprecated - public void activeScanSiteInScope(String apikey, String url) throws Exception { - ascan.scan(apikey, url, "true", "true", "", "", ""); + public void activeScanSiteInScope(String apiKey, String url) throws Exception { + ascan.scan(apiKey, url, "true", "true", "", "", ""); waitForAScanToFinish(url); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java index cd8df69..7de0717 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApiMain.java @@ -194,7 +194,7 @@ private void initialize(String[] args) { } setTask(args[0]); for (String arg : args) { - String[] pair = arg.split("="); + String[] pair = arg.split("=", 2); if (pair.length == 2) { if (pair[0].equalsIgnoreCase("zapaddr")) { zapaddr = pair[1]; @@ -247,7 +247,6 @@ private void showHelp() { + "\tsaveSession\n" + "\tnewSession\n"; } else { - // TODO add case for activeScanSiteInScope switch (task) { case stop: help = @@ -315,9 +314,18 @@ private void showHelp() { "usage: activeScanUrl url={url} [zapaddr={ip}] [zapport={port}]\n\n" + "Examples:\n\t" + "1. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' \n\t\t" - + "Execute and active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + + "Execute an active scan on http://myurl.com/ using zap listening on localhost:8090\n\t" + "2. Type 'java -jar zap-api.jar activeScanUrl url=http://myurl.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" - + "Execute and active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; + + "Execute an active scan on http://myurl.com/ using zap listening on 192.168.1.1:7080\n\t"; + break; + case activeScanSiteInScope: + help = + "usage: activeScanSiteInScope url={url} [zapaddr={ip}] [zapport={port}]\n\n" + + "Examples:\n\t" + + "1. Type 'java -jar zap-api.jar activeScanSiteInScope url=http://example.com/' \n\t\t" + + "Execute an active scan for URLs in scope under http://example.com/ using zap listening on localhost:8090\n\t" + + "2. Type 'java -jar zap-api.jar activeScanSiteInScope url=http://example.com/' zapaddr=192.168.1.1 zapport=7080' \n\t\t" + + "Execute an active scan for URLs in scope under http://example.com/ using zap listening on 192.168.1.1:7080\n\t"; break; case addExcludeRegexToContext: help = From e2002cceb967b6e5957fc6372868ecc34bf4a10d Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 5 Nov 2018 23:43:45 +0000 Subject: [PATCH 071/148] Add soap API Add the API of SOAP Scanner add-on (version 3). --- CHANGELOG.md | 3 + .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../java/org/zaproxy/clientapi/gen/Soap.java | 59 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Soap.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 8782f20..2c88cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add API for SOAP Scanner add-on, version 3. + ### Fixed - Disable XXE processing when parsing ZAP API responses. - Ensure alerts file is always closed. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 04d4f45..671f8a1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -71,6 +71,7 @@ import org.zaproxy.clientapi.gen.Search; import org.zaproxy.clientapi.gen.Selenium; import org.zaproxy.clientapi.gen.SessionManagement; +import org.zaproxy.clientapi.gen.Soap; import org.zaproxy.clientapi.gen.Spider; import org.zaproxy.clientapi.gen.Stats; import org.zaproxy.clientapi.gen.Users; @@ -119,6 +120,7 @@ public class ClientApi { public Script script = new Script(this); public Selenium selenium = new Selenium(this); public SessionManagement sessionManagement = new SessionManagement(this); + public Soap soap = new Soap(this); public Spider spider = new Spider(this); public Stats stats = new Stats(this); public Users users = new Users(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Soap.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Soap.java new file mode 100644 index 0000000..fd617f2 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Soap.java @@ -0,0 +1,59 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2018 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Soap { + + private final ClientApi api; + + public Soap(ClientApi api) { + this.api = api; + } + + /** + * Import a WSDL definition from local file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + return api.callApi("soap", "action", "importFile", map); + } + + /** + * Import a WSDL definition from a URL. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + return api.callApi("soap", "action", "importUrl", map); + } +} From e328204e81371b4ee289f76030fd365f956839ac Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 8 Nov 2018 15:52:12 +0000 Subject: [PATCH 072/148] Update Replacer and Importurls Update Replacer API, per release of version 7. Add description to Importurls API endpoint. --- CHANGELOG.md | 6 +++++- .../src/main/java/org/zaproxy/clientapi/gen/Importurls.java | 6 +++++- .../src/main/java/org/zaproxy/clientapi/gen/Replacer.java | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c88cc8..6f730a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add API for SOAP Scanner add-on, version 3. +### Changed +- Update Replacer API, per release of version 7. +- Add description to Importurls API endpoint. + ### Fixed - Disable XXE processing when parsing ZAP API responses. - Ensure alerts file is always closed. @@ -20,7 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Explicitly disable HTTP caching, to always obtain a fresh response from ZAP. ## [1.5.0] - 2017-11-30 -### Updated +### Changed - Core APIs updated for ZAP version 2.7.0. ## [1.4.0] - 2017-07-13 diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java index 2ccf678..61dee90 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -35,7 +35,11 @@ public Importurls(ClientApi api) { this.api = api; } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Imports URLs (one per line) from the file with the given file system path. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse importurls(String filepath) throws ClientApiException { Map map = new HashMap<>(); map.put("filePath", filepath); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 85fe38b..3df143b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -70,7 +70,9 @@ public ApiResponse addRule( map.put("matchType", matchtype); map.put("matchRegex", matchregex); map.put("matchString", matchstring); - map.put("replacement", replacement); + if (replacement != null) { + map.put("replacement", replacement); + } if (initiators != null) { map.put("initiators", initiators); } From a06ae3cc37f37543ed4c3e783019061ab3875ebe Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 17 Jan 2019 16:05:42 +0000 Subject: [PATCH 073/148] Remove obsolete Travis CI configuration Remove the `sudo` configuration, the builds run now always in the same (new) infrastructure regardless of the configuration. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 521f1d5..c20f361 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: java -sudo: false jdk: - oraclejdk8 From 1a490d79793c30d0eb5bf49328b53667ed8f507e Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 17 Jan 2019 16:08:24 +0000 Subject: [PATCH 074/148] Use line feeds always Change `.gitattributes` to use line feeds (instead of auto) to make reproducible builds easier everywhere (if we happen to bundle text files). --- .gitattributes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 1a939d9..a6d2619 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -* text=auto +* text=lf *.java text *.properties text @@ -7,7 +7,7 @@ *.gradle text *.bat text eol=crlf -*.sh text eol=lf -gradlew text eol=lf +*.sh text +gradlew text *.jar binary \ No newline at end of file From b73240fe0b8c627335995855a723de8828499cbc Mon Sep 17 00:00:00 2001 From: Jonathan Leitschuh Date: Wed, 27 Mar 2019 17:15:00 -0400 Subject: [PATCH 075/148] Point Users to HTTPS version of Maven Central --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1a5ea1..f4ca4d5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ This project produces two libraries: The latest released versions can be downloaded from the [Releases page](https://github.com/zaproxy/zap-api-java/releases). Or, if using a dependency management tool, for example [Maven](https://maven.apache.org/) or [Gradle](https://gradle.org/), the `zap-clientapi` library -can be obtained from [Maven Central](http://search.maven.org/) with following coordinates: +can be obtained from [Maven Central](https://search.maven.org/) with following coordinates: * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` From b67585efe868d918c6fa86878db990bf7ca69e9c Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 3 May 2019 23:43:37 +0100 Subject: [PATCH 076/148] Update Gradle Update Gradle to 5.2.1 and Spotless to 3.23.0. Remove preview feature, no longer needed. Signed-off-by: thc202 --- build.gradle | 8 +------- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 22 ---------------------- 3 files changed, 2 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index f5f3466..bc7d5c9 100644 --- a/build.gradle +++ b/build.gradle @@ -8,12 +8,7 @@ buildscript { } plugins { - id "com.diffplug.gradle.spotless" version "3.13.0" apply false -} - -wrapper { - gradleVersion = '4.8.1' - distributionType = Wrapper.DistributionType.ALL + id "com.diffplug.gradle.spotless" version "3.23.0" apply false } apply from: "gradle/compile.gradle" @@ -29,7 +24,6 @@ subprojects { ext.versionBC = '1.6.0' repositories { - mavenLocal() mavenCentral() } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index debd024..1b2b07c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index f92ef68..fd11ff4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,25 +1,3 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2016 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -enableFeaturePreview('STABLE_PUBLISHING') - include 'zap-clientapi' include 'zap-clientapi-ant' From 0ec321516f9fb3958743a232baee95d0a417235c Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 13 May 2019 23:43:30 +0100 Subject: [PATCH 077/148] Correct gitattributes Correct default text declaration. Remove redundant text attribute in bat files. Signed-off-by: thc202 --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index a6d2619..57cb43d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,4 @@ -* text=lf +* text=auto eol=lf *.java text *.properties text @@ -6,7 +6,7 @@ *.xml text *.gradle text -*.bat text eol=crlf +*.bat eol=crlf *.sh text gradlew text From 8afa79a41963b083618dc52fcf5c2609d967faea Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 30 May 2019 10:18:45 +0100 Subject: [PATCH 078/148] Regenerate core APIs for 2.8.0 Address deprecations and move methods to keep the API client binary compatible with previous versions. Signed-off-by: thc202 --- CHANGELOG.md | 1 + .../org/zaproxy/clientapi/core/ClientApi.java | 4 +- .../java/org/zaproxy/clientapi/gen/Alert.java | 130 +++++++++++ .../java/org/zaproxy/clientapi/gen/Ascan.java | 35 +++ .../zaproxy/clientapi/gen/Authentication.java | 8 + .../org/zaproxy/clientapi/gen/Autoupdate.java | 11 + .../org/zaproxy/clientapi/gen/Context.java | 17 ++ .../java/org/zaproxy/clientapi/gen/Core.java | 206 ++++++++++++------ .../zaproxy/clientapi/gen/HttpSessions.java | 32 +++ .../java/org/zaproxy/clientapi/gen/Pscan.java | 17 ++ .../org/zaproxy/clientapi/gen/Script.java | 101 ++++++++- .../org/zaproxy/clientapi/gen/Search.java | 52 +++++ .../clientapi/gen/SessionManagement.java | 4 + .../org/zaproxy/clientapi/gen/Spider.java | 4 +- .../java/org/zaproxy/clientapi/gen/Users.java | 31 ++- .../gen/deprecated/CoreDeprecated.java | 4 + 16 files changed, 580 insertions(+), 77 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f730a2..2dd100c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add API for SOAP Scanner add-on, version 3. ### Changed +- Core APIs updated for ZAP version 2.8.0. - Update Replacer API, per release of version 7. - Add description to Importurls API endpoint. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 671f8a1..0dfb6de 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -99,6 +99,7 @@ public class ClientApi { public Acsrf acsrf = new Acsrf(this); public AjaxSpider ajaxSpider = new AjaxSpider(this); public AlertFilter alertFilter = new AlertFilter(this); + public org.zaproxy.clientapi.gen.Alert alert = new org.zaproxy.clientapi.gen.Alert(this); public Ascan ascan = new Ascan(this); public Authentication authentication = new Authentication(this); public Authorization authorization = new Authorization(this); @@ -246,7 +247,8 @@ public void checkAlerts(List ignoreAlerts, List requireAlerts, Fil public List getAlerts(String baseUrl, int start, int count) throws ClientApiException { List alerts = new ArrayList(); - ApiResponse response = core.alerts(baseUrl, String.valueOf(start), String.valueOf(count)); + ApiResponse response = + alert.alerts(baseUrl, String.valueOf(start), String.valueOf(count), null); if (response != null && response instanceof ApiResponseList) { ApiResponseList alertList = (ApiResponseList) response; for (ApiResponse resp : alertList.getItems()) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java new file mode 100644 index 0000000..2ba20dd --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java @@ -0,0 +1,130 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2019 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Alert { + + private final ClientApi api; + + public Alert(ClientApi api) { + this.api = api; + } + + /** + * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the + * 'messageId' field and 'message' API method + */ + public ApiResponse alert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("alert", "view", "alert", map); + } + + /** + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with + * 'start' position and 'count' of alerts + */ + public ApiResponse alerts(String baseurl, String start, String count, String riskid) + throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("alert", "view", "alerts", map); + } + + /** Gets number of alerts grouped by each risk level, optionally filtering by URL */ + public ApiResponse alertsSummary(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("alert", "view", "alertsSummary", map); + } + + /** Gets the number of alerts, optionally filtering by URL or riskId */ + public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("alert", "view", "numberOfAlerts", map); + } + + /** + * Gets a summary of the alerts, optionally filtered by a 'url'. If 'recurse' is true then all + * alerts that apply to urls that start with the specified 'url' will be returned, otherwise + * only those on exactly the same 'url' (ignoring url parameters) + */ + public ApiResponse alertsByRisk(String url, String recurse) throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (recurse != null) { + map.put("recurse", recurse); + } + return api.callApi("alert", "view", "alertsByRisk", map); + } + + /** Gets a count of the alerts, optionally filtered as per alertsPerRisk */ + public ApiResponse alertCountsByRisk(String url, String recurse) throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + if (recurse != null) { + map.put("recurse", recurse); + } + return api.callApi("alert", "view", "alertCountsByRisk", map); + } + + /** Deletes all alerts of the current session. */ + public ApiResponse deleteAllAlerts() throws ClientApiException { + return api.callApi("alert", "action", "deleteAllAlerts", null); + } + + /** Deletes the alert with the given ID. */ + public ApiResponse deleteAlert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("alert", "action", "deleteAlert", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index a0e630c..cbd9ea1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -85,6 +85,9 @@ public ApiResponse excludedFromScan() throws ClientApiException { return api.callApi("ascan", "view", "excludedFromScan", null); } + /** + * Gets the scanners, optionally, of the given scan policy and/or scanner policy/category ID. + */ public ApiResponse scanners(String scanpolicyname, String policyid) throws ClientApiException { Map map = new HashMap<>(); if (scanpolicyname != null) { @@ -189,6 +192,14 @@ public ApiResponse optionThreadPerHost() throws ClientApiException { return api.callApi("ascan", "view", "optionThreadPerHost", null); } + /** + * Tells whether or not the active scanner should add a query parameter to GET request that + * don't have parameters to start with. + */ + public ApiResponse optionAddQueryParam() throws ClientApiException { + return api.callApi("ascan", "view", "optionAddQueryParam", null); + } + public ApiResponse optionAllowAttackOnStart() throws ClientApiException { return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); } @@ -368,6 +379,9 @@ public ApiResponse excludeFromScan(String regex) throws ClientApiException { return api.callApi("ascan", "action", "excludeFromScan", map); } + /** + * Enables all scanners of the scan policy with the given name, or the default if none given. + */ public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (scanpolicyname != null) { @@ -376,6 +390,9 @@ public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiExce return api.callApi("ascan", "action", "enableAllScanners", map); } + /** + * Disables all scanners of the scan policy with the given name, or the default if none given. + */ public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); if (scanpolicyname != null) { @@ -384,6 +401,10 @@ public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiExc return api.callApi("ascan", "action", "disableAllScanners", map); } + /** + * Enables the scanners with the given IDs (comma separated list of IDs) of the scan policy with + * the given name, or the default if none given. + */ public ApiResponse enableScanners(String ids, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); @@ -393,6 +414,10 @@ public ApiResponse enableScanners(String ids, String scanpolicyname) throws Clie return api.callApi("ascan", "action", "enableScanners", map); } + /** + * Disables the scanners with the given IDs (comma separated list of IDs) of the scan policy + * with the given name, or the default if none given. + */ public ApiResponse disableScanners(String ids, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); @@ -572,6 +597,16 @@ public ApiResponse setOptionDefaultPolicy(String string) throws ClientApiExcepti return api.callApi("ascan", "action", "setOptionDefaultPolicy", map); } + /** + * Sets whether or not the active scanner should add a query param to GET requests which do not + * have parameters to start with. + */ + public ApiResponse setOptionAddQueryParam(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionAddQueryParam", map); + } + public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java index 4b9373d..f7d0f94 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Authentication.java @@ -36,10 +36,12 @@ public Authentication(ClientApi api) { this.api = api; } + /** Gets the name of the authentication methods. */ public ApiResponse getSupportedAuthenticationMethods() throws ClientApiException { return api.callApi("authentication", "view", "getSupportedAuthenticationMethods", null); } + /** Gets the configuration parameters for the authentication method with the given name. */ public ApiResponse getAuthenticationMethodConfigParams(String authmethodname) throws ClientApiException { Map map = new HashMap<>(); @@ -47,24 +49,28 @@ public ApiResponse getAuthenticationMethodConfigParams(String authmethodname) return api.callApi("authentication", "view", "getAuthenticationMethodConfigParams", map); } + /** Gets the name of the authentication method for the context with the given ID. */ public ApiResponse getAuthenticationMethod(String contextid) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getAuthenticationMethod", map); } + /** Gets the logged in indicator for the context with the given ID. */ public ApiResponse getLoggedInIndicator(String contextid) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getLoggedInIndicator", map); } + /** Gets the logged out indicator for the context with the given ID. */ public ApiResponse getLoggedOutIndicator(String contextid) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("authentication", "view", "getLoggedOutIndicator", map); } + /** Sets the authentication method for the context with the given ID. */ public ApiResponse setAuthenticationMethod( String contextid, String authmethodname, String authmethodconfigparams) throws ClientApiException { @@ -77,6 +83,7 @@ public ApiResponse setAuthenticationMethod( return api.callApi("authentication", "action", "setAuthenticationMethod", map); } + /** Sets the logged in indicator for the context with the given ID. */ public ApiResponse setLoggedInIndicator(String contextid, String loggedinindicatorregex) throws ClientApiException { Map map = new HashMap<>(); @@ -85,6 +92,7 @@ public ApiResponse setLoggedInIndicator(String contextid, String loggedinindicat return api.callApi("authentication", "action", "setLoggedInIndicator", map); } + /** Sets the logged out indicator for the context with the given ID. */ public ApiResponse setLoggedOutIndicator(String contextid, String loggedoutindicatorregex) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index cced27b..6e7d1a2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -51,6 +51,11 @@ public ApiResponse installedAddons() throws ClientApiException { return api.callApi("autoupdate", "view", "installedAddons", null); } + /** Returns a list with all local add-ons, installed or not. */ + public ApiResponse localAddons() throws ClientApiException { + return api.callApi("autoupdate", "view", "localAddons", null); + } + /** * Return a list of any add-ons that have been added to the Marketplace since the last check for * updates @@ -139,6 +144,12 @@ public ApiResponse installAddon(String id) throws ClientApiException { return api.callApi("autoupdate", "action", "installAddon", map); } + public ApiResponse installLocalAddon(String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + return api.callApi("autoupdate", "action", "installLocalAddon", map); + } + /** Uninstalls the specified add-on */ public ApiResponse uninstallAddon(String id) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 314727b..352f960 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -81,6 +81,13 @@ public ApiResponse excludedTechnologyList(String contextname) throws ClientApiEx return api.callApi("context", "view", "excludedTechnologyList", map); } + /** Lists the URLs accessed through/by ZAP, that belong to the context with the given name. */ + public ApiResponse urls(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("context", "view", "urls", map); + } + /** Add exclude regex to context */ public ApiResponse excludeFromContext(String contextname, String regex) throws ClientApiException { @@ -99,6 +106,16 @@ public ApiResponse includeInContext(String contextname, String regex) return api.callApi("context", "action", "includeInContext", map); } + /** Set the regexs to include and exclude for a context, both supplied as JSON string arrays */ + public ApiResponse setContextRegexs(String contextname, String incregexs, String excregexs) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("incRegexs", incregexs); + map.put("excRegexs", excregexs); + return api.callApi("context", "action", "setContextRegexs", map); + } + /** Creates a new context with the given name in the current session */ public ApiResponse newContext(String contextname) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index d6127b6..cae5390 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -36,59 +36,6 @@ public Core(ClientApi api) { this.api = api; } - /** - * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the - * 'messageId' field and 'message' API method - */ - public ApiResponse alert(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("core", "view", "alert", map); - } - - /** - * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with - * 'start' position and 'count' of alerts - */ - public ApiResponse alerts(String baseurl, String start, String count, String riskid) - throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (start != null) { - map.put("start", start); - } - if (count != null) { - map.put("count", count); - } - if (riskid != null) { - map.put("riskId", riskid); - } - return api.callApi("core", "view", "alerts", map); - } - - /** Gets number of alerts grouped by each risk level, optionally filtering by URL */ - public ApiResponse alertsSummary(String baseurl) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - return api.callApi("core", "view", "alertsSummary", map); - } - - /** Gets the number of alerts, optionally filtering by URL or riskId */ - public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { - Map map = new HashMap<>(); - if (baseurl != null) { - map.put("baseurl", baseurl); - } - if (riskid != null) { - map.put("riskId", riskid); - } - return api.callApi("core", "view", "numberOfAlerts", map); - } - /** Gets the name of the hosts accessed through/by ZAP */ public ApiResponse hosts() throws ClientApiException { return api.callApi("core", "view", "hosts", null); @@ -108,6 +55,15 @@ public ApiResponse urls(String baseurl) throws ClientApiException { return api.callApi("core", "view", "urls", map); } + /** Gets the child nodes underneath the specified URL in the Sites tree */ + public ApiResponse childNodes(String url) throws ClientApiException { + Map map = new HashMap<>(); + if (url != null) { + map.put("url", url); + } + return api.callApi("core", "view", "childNodes", map); + } + /** * Gets the HTTP message with the given ID. Returns the ID, request/response headers and bodies, * cookies, note, type, RTT, and timestamp. @@ -235,6 +191,75 @@ public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { return api.callApi("core", "view", "optionAlertOverridesFilePath", null); } + /** + * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the + * 'messageId' field and 'message' API method + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse alert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "view", "alert", map); + } + + /** + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with + * 'start' position and 'count' of alerts + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse alerts(String baseurl, String start, String count, String riskid) + throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("core", "view", "alerts", map); + } + + /** + * Gets number of alerts grouped by each risk level, optionally filtering by URL + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse alertsSummary(String baseurl) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + return api.callApi("core", "view", "alertsSummary", map); + } + + /** + * Gets the number of alerts, optionally filtering by URL or riskId + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("core", "view", "numberOfAlerts", map); + } + /** * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). @@ -272,6 +297,7 @@ public ApiResponse optionProxyChainUserName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainUserName", null); } + /** Gets the connection time out, in seconds. */ public ApiResponse optionTimeoutInSecs() throws ClientApiException { return api.callApi("core", "view", "optionTimeoutInSecs", null); } @@ -354,8 +380,21 @@ public ApiResponse saveSession(String name, String overwrite) throws ClientApiEx return api.callApi("core", "action", "saveSession", map); } - public ApiResponse snapshotSession() throws ClientApiException { - return api.callApi("core", "action", "snapshotSession", null); + /** + * Snapshots the session, optionally with the given name, and overwriting existing files. If no + * name is specified the name of the current session with a timestamp appended is used. If a + * relative path is specified it will be resolved against the "session" directory in ZAP "home" + * dir. + */ + public ApiResponse snapshotSession(String name, String overwrite) throws ClientApiException { + Map map = new HashMap<>(); + if (name != null) { + map.put("name", name); + } + if (overwrite != null) { + map.put("overwrite", overwrite); + } + return api.callApi("core", "action", "snapshotSession", map); } /** Clears the regexes of URLs excluded from the local proxies. */ @@ -404,18 +443,6 @@ public ApiResponse sendRequest(String request, String followredirects) return api.callApi("core", "action", "sendRequest", map); } - /** Deletes all alerts of the current session. */ - public ApiResponse deleteAllAlerts() throws ClientApiException { - return api.callApi("core", "action", "deleteAllAlerts", null); - } - - /** Deletes the alert with the given ID. */ - public ApiResponse deleteAlert(String id) throws ClientApiException { - Map map = new HashMap<>(); - map.put("id", id); - return api.callApi("core", "action", "deleteAlert", map); - } - public ApiResponse runGarbageCollection() throws ClientApiException { return api.callApi("core", "action", "runGarbageCollection", null); } @@ -523,6 +550,48 @@ public ApiResponse setOptionAlertOverridesFilePath(String filepath) throws Clien return api.callApi("core", "action", "setOptionAlertOverridesFilePath", map); } + /** + * Enables use of a PKCS12 client certificate for the certificate with the given file system + * path, password, and optional index. + */ + public ApiResponse enablePKCS12ClientCertificate(String filepath, String password, String index) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + map.put("password", password); + if (index != null) { + map.put("index", index); + } + return api.callApi("core", "action", "enablePKCS12ClientCertificate", map); + } + + /** Disables the option for use of client certificates. */ + public ApiResponse disableClientCertificate() throws ClientApiException { + return api.callApi("core", "action", "disableClientCertificate", null); + } + + /** + * Deletes all alerts of the current session. + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse deleteAllAlerts() throws ClientApiException { + return api.callApi("core", "action", "deleteAllAlerts", null); + } + + /** + * Deletes the alert with the given ID. + * + * @deprecated Use the API endpoint with the same name in the 'alert' component instead. + */ + @Deprecated + public ApiResponse deleteAlert(String id) throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + return api.callApi("core", "action", "deleteAlert", map); + } + /** * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). @@ -554,7 +623,7 @@ public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiExcep /** * Use actions [add|modify|remove]ProxyChainExcludedDomain instead. * - * @deprecated + * @deprecated Option no longer in effective use. */ @Deprecated public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiException { @@ -600,6 +669,7 @@ public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws Clien return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); } + /** Sets the connection time out, in seconds. */ public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java index 12215e3..afa6d79 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/HttpSessions.java @@ -68,6 +68,11 @@ public ApiResponse sessionTokens(String site) throws ClientApiException { return api.callApi("httpSessions", "view", "sessionTokens", map); } + /** Gets the default session tokens. */ + public ApiResponse defaultSessionTokens() throws ClientApiException { + return api.callApi("httpSessions", "view", "defaultSessionTokens", null); + } + /** Creates an empty session for the given site. Optionally with the given name. */ public ApiResponse createEmptySession(String site, String session) throws ClientApiException { Map map = new HashMap<>(); @@ -139,4 +144,31 @@ public ApiResponse renameSession(String site, String oldsessionname, String news map.put("newSessionName", newsessionname); return api.callApi("httpSessions", "action", "renameSession", map); } + + /** Adds a default session token with the given name and enabled state. */ + public ApiResponse addDefaultSessionToken(String sessiontoken, String tokenenabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("sessionToken", sessiontoken); + if (tokenenabled != null) { + map.put("tokenEnabled", tokenenabled); + } + return api.callApi("httpSessions", "action", "addDefaultSessionToken", map); + } + + /** Sets whether or not the default session token with the given name is enabled. */ + public ApiResponse setDefaultSessionTokenEnabled(String sessiontoken, String tokenenabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("sessionToken", sessiontoken); + map.put("tokenEnabled", tokenenabled); + return api.callApi("httpSessions", "action", "setDefaultSessionTokenEnabled", map); + } + + /** Removes the default session token with the given name. */ + public ApiResponse removeDefaultSessionToken(String sessiontoken) throws ClientApiException { + Map map = new HashMap<>(); + map.put("sessionToken", sessiontoken); + return api.callApi("httpSessions", "action", "removeDefaultSessionToken", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index af206dd..b2a4e93 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -53,6 +53,16 @@ public ApiResponse scanners() throws ClientApiException { return api.callApi("pscan", "view", "scanners", null); } + /** Show information about the passive scan rule currently being run (if any). */ + public ApiResponse currentRule() throws ClientApiException { + return api.callApi("pscan", "view", "currentRule", null); + } + + /** Gets the maximum number of alerts a passive scan rule should raise. */ + public ApiResponse maxAlertsPerRule() throws ClientApiException { + return api.callApi("pscan", "view", "maxAlertsPerRule", null); + } + /** * Sets whether or not the passive scanning is enabled (Note: the enabled state is not * persisted). @@ -107,4 +117,11 @@ public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) map.put("alertThreshold", alertthreshold); return api.callApi("pscan", "action", "setScannerAlertThreshold", map); } + + /** Sets the maximum number of alerts a passive scan rule should raise. */ + public ApiResponse setMaxAlertsPerRule(String maxalerts) throws ClientApiException { + Map map = new HashMap<>(); + map.put("maxAlerts", maxalerts); + return api.callApi("pscan", "action", "setMaxAlertsPerRule", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 5b95124..6af85e1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -42,11 +42,52 @@ public ApiResponse listEngines() throws ClientApiException { return api.callApi("script", "view", "listEngines", null); } + /** Lists the script types available. */ + public ApiResponse listTypes() throws ClientApiException { + return api.callApi("script", "view", "listTypes", null); + } + /** Lists the scripts available, with its engine, name, description, type and error state. */ public ApiResponse listScripts() throws ClientApiException { return api.callApi("script", "view", "listScripts", null); } + /** + * Gets the value of the global variable with the given key. Returns an API error + * (DOES_NOT_EXIST) if no value was previously set. + */ + public ApiResponse globalVar(String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("varKey", varkey); + return api.callApi("script", "view", "globalVar", map); + } + + /** Gets all the global variables (key/value pairs). */ + public ApiResponse globalVars() throws ClientApiException { + return api.callApi("script", "view", "globalVars", null); + } + + /** + * Gets the value of the variable with the given key for the given script. Returns an API error + * (DOES_NOT_EXIST) if no script with the given name exists or if no value was previously set. + */ + public ApiResponse scriptVar(String scriptname, String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("varKey", varkey); + return api.callApi("script", "view", "scriptVar", map); + } + + /** + * Gets all the variables (key/value pairs) of the given script. Returns an API error + * (DOES_NOT_EXIST) if no script with the given name exists. + */ + public ApiResponse scriptVars(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "view", "scriptVars", map); + } + /** Enables the script with the given name */ public ApiResponse enable(String scriptname) throws ClientApiException { Map map = new HashMap<>(); @@ -95,10 +136,68 @@ public ApiResponse remove(String scriptname) throws ClientApiException { return api.callApi("script", "action", "remove", map); } - /** Runs the stand alone script with the give name */ + /** Runs the stand alone script with the given name */ public ApiResponse runStandAloneScript(String scriptname) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "runStandAloneScript", map); } + + /** Clears the global variable with the given key. */ + public ApiResponse clearGlobalVar(String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("varKey", varkey); + return api.callApi("script", "action", "clearGlobalVar", map); + } + + /** Clears the global variables. */ + public ApiResponse clearGlobalVars() throws ClientApiException { + return api.callApi("script", "action", "clearGlobalVars", null); + } + + /** + * Clears the variable with the given key of the given script. Returns an API error + * (DOES_NOT_EXIST) if no script with the given name exists. + */ + public ApiResponse clearScriptVar(String scriptname, String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("varKey", varkey); + return api.callApi("script", "action", "clearScriptVar", map); + } + + /** + * Clears the variables of the given script. Returns an API error (DOES_NOT_EXIST) if no script + * with the given name exists. + */ + public ApiResponse clearScriptVars(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "action", "clearScriptVars", map); + } + + /** + * Sets the value of the variable with the given key of the given script. Returns an API error + * (DOES_NOT_EXIST) if no script with the given name exists. + */ + public ApiResponse setScriptVar(String scriptname, String varkey, String varvalue) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("varKey", varkey); + if (varvalue != null) { + map.put("varValue", varvalue); + } + return api.callApi("script", "action", "setScriptVar", map); + } + + /** Sets the value of the global variable with the given key. */ + public ApiResponse setGlobalVar(String varkey, String varvalue) throws ClientApiException { + Map map = new HashMap<>(); + map.put("varKey", varkey); + if (varvalue != null) { + map.put("varValue", varvalue); + } + return api.callApi("script", "action", "setGlobalVar", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index 48b74c0..b4a4b97 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -36,6 +36,10 @@ public Search(ClientApi api) { this.api = api; } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in the URL + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -52,6 +56,10 @@ public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, St return api.callApi("search", "view", "urlsByUrlRegex", map); } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in the request + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -68,6 +76,10 @@ public ApiResponse urlsByRequestRegex(String regex, String baseurl, String start return api.callApi("search", "view", "urlsByRequestRegex", map); } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in the response + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse urlsByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -84,6 +96,11 @@ public ApiResponse urlsByResponseRegex(String regex, String baseurl, String star return api.callApi("search", "view", "urlsByResponseRegex", map); } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in the + * header(s) optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -100,6 +117,10 @@ public ApiResponse urlsByHeaderRegex(String regex, String baseurl, String start, return api.callApi("search", "view", "urlsByHeaderRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in the URL optionally + * filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -116,6 +137,10 @@ public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start return api.callApi("search", "view", "messagesByUrlRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in the request optionally + * filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse messagesByRequestRegex( String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -132,6 +157,10 @@ public ApiResponse messagesByRequestRegex( return api.callApi("search", "view", "messagesByRequestRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in the response optionally + * filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse messagesByResponseRegex( String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -148,6 +177,10 @@ public ApiResponse messagesByResponseRegex( return api.callApi("search", "view", "messagesByResponseRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in the header(s) optionally + * filtered by URL and paginated with 'start' position and 'count' of messages. + */ public ApiResponse messagesByHeaderRegex( String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -164,6 +197,10 @@ public ApiResponse messagesByHeaderRegex( return api.callApi("search", "view", "messagesByHeaderRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in the URL + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ public byte[] harByUrlRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -180,6 +217,11 @@ public byte[] harByUrlRegex(String regex, String baseurl, String start, String c return api.callApiOther("search", "other", "harByUrlRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in the + * request optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ public byte[] harByRequestRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -196,6 +238,11 @@ public byte[] harByRequestRegex(String regex, String baseurl, String start, Stri return api.callApiOther("search", "other", "harByRequestRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in the + * response optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ public byte[] harByResponseRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -212,6 +259,11 @@ public byte[] harByResponseRegex(String regex, String baseurl, String start, Str return api.callApiOther("search", "other", "harByResponseRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in the + * header(s) optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ public byte[] harByHeaderRegex(String regex, String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java index 6bf87fb..683bdd2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/SessionManagement.java @@ -37,11 +37,13 @@ public SessionManagement(ClientApi api) { this.api = api; } + /** Gets the name of the session management methods. */ public ApiResponse getSupportedSessionManagementMethods() throws ClientApiException { return api.callApi( "sessionManagement", "view", "getSupportedSessionManagementMethods", null); } + /** Gets the configuration parameters for the session management method with the given name. */ public ApiResponse getSessionManagementMethodConfigParams(String methodname) throws ClientApiException { Map map = new HashMap<>(); @@ -50,12 +52,14 @@ public ApiResponse getSessionManagementMethodConfigParams(String methodname) "sessionManagement", "view", "getSessionManagementMethodConfigParams", map); } + /** Gets the name of the session management method for the context with the given ID. */ public ApiResponse getSessionManagementMethod(String contextid) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); return api.callApi("sessionManagement", "view", "getSessionManagementMethod", map); } + /** Sets the session management method for the context with the given ID. */ public ApiResponse setSessionManagementMethod( String contextid, String methodname, String methodconfigparams) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index f20488b..5d27f2e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -121,6 +121,7 @@ public ApiResponse optionMaxChildren() throws ClientApiException { return api.callApi("spider", "view", "optionMaxChildren", null); } + /** Gets the maximum depth the spider can crawl, 0 if unlimited. */ public ApiResponse optionMaxDepth() throws ClientApiException { return api.callApi("spider", "view", "optionMaxDepth", null); } @@ -391,7 +392,7 @@ public ApiResponse setOptionHandleParameters(String string) throws ClientApiExce /** * Use actions [add|modify|remove]DomainAlwaysInScope instead. * - * @deprecated + * @deprecated Option no longer in effective use. */ @Deprecated public ApiResponse setOptionScopeString(String string) throws ClientApiException { @@ -433,6 +434,7 @@ public ApiResponse setOptionMaxChildren(int i) throws ClientApiException { return api.callApi("spider", "action", "setOptionMaxChildren", map); } + /** Sets the maximum depth the spider can crawl, 0 for unlimited depth. */ public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 87e4333..1a43f70 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -36,6 +36,10 @@ public Users(ClientApi api) { this.api = api; } + /** + * Gets a list of users that belong to the context with the given ID, or all users if none + * provided. + */ public ApiResponse usersList(String contextid) throws ClientApiException { Map map = new HashMap<>(); if (contextid != null) { @@ -44,17 +48,17 @@ public ApiResponse usersList(String contextid) throws ClientApiException { return api.callApi("users", "view", "usersList", map); } + /** + * Gets the data of the user with the given ID that belongs to the context with the given ID. + */ public ApiResponse getUserById(String contextid, String userid) throws ClientApiException { Map map = new HashMap<>(); - if (contextid != null) { - map.put("contextId", contextid); - } - if (userid != null) { - map.put("userId", userid); - } + map.put("contextId", contextid); + map.put("userId", userid); return api.callApi("users", "view", "getUserById", map); } + /** Gets the configuration parameters for the credentials of the context with the given ID. */ public ApiResponse getAuthenticationCredentialsConfigParams(String contextid) throws ClientApiException { Map map = new HashMap<>(); @@ -62,6 +66,10 @@ public ApiResponse getAuthenticationCredentialsConfigParams(String contextid) return api.callApi("users", "view", "getAuthenticationCredentialsConfigParams", map); } + /** + * Gets the authentication credentials of the user with given ID that belongs to the context + * with the given ID. + */ public ApiResponse getAuthenticationCredentials(String contextid, String userid) throws ClientApiException { Map map = new HashMap<>(); @@ -70,6 +78,7 @@ public ApiResponse getAuthenticationCredentials(String contextid, String userid) return api.callApi("users", "view", "getAuthenticationCredentials", map); } + /** Creates a new user with the given name for the context with the given ID. */ public ApiResponse newUser(String contextid, String name) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); @@ -77,6 +86,7 @@ public ApiResponse newUser(String contextid, String name) throws ClientApiExcept return api.callApi("users", "action", "newUser", map); } + /** Removes the user with the given ID that belongs to the context with the given ID. */ public ApiResponse removeUser(String contextid, String userid) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); @@ -84,6 +94,10 @@ public ApiResponse removeUser(String contextid, String userid) throws ClientApiE return api.callApi("users", "action", "removeUser", map); } + /** + * Sets whether or not the user, with the given ID that belongs to the context with the given + * ID, should be enabled. + */ public ApiResponse setUserEnabled(String contextid, String userid, String enabled) throws ClientApiException { Map map = new HashMap<>(); @@ -93,6 +107,7 @@ public ApiResponse setUserEnabled(String contextid, String userid, String enable return api.callApi("users", "action", "setUserEnabled", map); } + /** Renames the user with the given ID that belongs to the context with the given ID. */ public ApiResponse setUserName(String contextid, String userid, String name) throws ClientApiException { Map map = new HashMap<>(); @@ -102,6 +117,10 @@ public ApiResponse setUserName(String contextid, String userid, String name) return api.callApi("users", "action", "setUserName", map); } + /** + * Sets the authentication credentials for the user with the given ID that belongs to the + * context with the given ID. + */ public ApiResponse setAuthenticationCredentials( String contextid, String userid, String authcredentialsconfigparams) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java index 91abb53..31353b8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/CoreDeprecated.java @@ -646,4 +646,8 @@ public ApiResponse numberOfAlerts(String baseurl) throws ClientApiException { public ApiResponse urls() throws ClientApiException { return api.callApi("core", "view", "urls", null); } + + public ApiResponse snapshotSession() throws ClientApiException { + return api.callApi("core", "action", "snapshotSession", null); + } } From 005bde0080a2e2718975ba267dd304e72e544ff0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 11 Jun 2019 23:46:22 +0100 Subject: [PATCH 079/148] Update Travis CI badge Use `travis-ci.com`, the project was migrated there. Signed-off-by: thc202 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4ca4d5..df70053 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Build Status](https://api.travis-ci.org/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.org/zaproxy/zap-api-java) +[![Build Status](https://api.travis-ci.com/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.com/zaproxy/zap-api-java) [![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) The Java implementation to access the [OWASP ZAP API](https://github.com/zaproxy/zaproxy/wiki/ApiDetails). For more information From 4ead48a0a665a699a17866ed2687695bf408f1af Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jun 2019 13:34:50 +0100 Subject: [PATCH 080/148] Update APIs of add-ons Update the APIs of the following add-ons: - Context Alert Filters version 8; - Selenium version 15.0.0; - WebSockets version 19. Signed-off-by: thc202 --- CHANGELOG.md | 4 +++- .../zaproxy/clientapi/gen/AlertFilter.java | 22 ++++++++++++++----- .../org/zaproxy/clientapi/gen/Selenium.java | 14 ++++-------- .../org/zaproxy/clientapi/gen/Websocket.java | 22 +++++++++++++++++++ 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dd100c..d3bcd79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Core APIs updated for ZAP version 2.8.0. - Update Replacer API, per release of version 7. -- Add description to Importurls API endpoint. +- Update Websocket API, per release of version 19. +- Update Selenium API, per release of version 15.0.0. +- Add description to Importurls and AlertFilter API endpoints. ### Fixed - Disable XXE processing when parsing ZAP API responses. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 29d4273..9512cbb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -35,16 +35,22 @@ public AlertFilter(ClientApi api) { this.api = api; } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Lists the alert filters of the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse alertFilterList(String contextid) throws ClientApiException { Map map = new HashMap<>(); - if (contextid != null) { - map.put("contextId", contextid); - } + map.put("contextId", contextid); return api.callApi("alertFilter", "view", "alertFilterList", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Adds a new alert filter for the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse addAlertFilter( String contextid, String ruleid, @@ -73,7 +79,11 @@ public ApiResponse addAlertFilter( return api.callApi("alertFilter", "action", "addAlertFilter", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Removes an alert filter from the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse removeAlertFilter( String contextid, String ruleid, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index d473e02..3393c4e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -63,11 +63,8 @@ public ApiResponse optionFirefoxDriverPath() throws ClientApiException { return api.callApi("selenium", "view", "optionFirefoxDriverPath", null); } - /** - * Returns the current path to IEDriverServer - * - *

This component is optional and therefore the API will only work if it is installed - */ + /** This component is optional and therefore the API will only work if it is installed */ + @Deprecated public ApiResponse optionIeDriverPath() throws ClientApiException { return api.callApi("selenium", "view", "optionIeDriverPath", null); } @@ -114,11 +111,8 @@ public ApiResponse setOptionFirefoxDriverPath(String string) throws ClientApiExc return api.callApi("selenium", "action", "setOptionFirefoxDriverPath", map); } - /** - * Sets the current path to IEDriverServer - * - *

This component is optional and therefore the API will only work if it is installed - */ + /** This component is optional and therefore the API will only work if it is installed */ + @Deprecated public ApiResponse setOptionIeDriverPath(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java index 37072b2..799c0ac 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Websocket.java @@ -83,6 +83,15 @@ public ApiResponse messages( return api.callApi("websocket", "view", "messages", map); } + /** + * Returns a text representation of an intercepted websockets message + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse breakTextMessage() throws ClientApiException { + return api.callApi("websocket", "view", "breakTextMessage", null); + } + /** * Sends the specified message on the channel specified by channelId, if outgoing is 'True' then * the message will be sent to the server and if it is 'False' then it will be sent to the @@ -98,4 +107,17 @@ public ApiResponse sendTextMessage(String channelid, String outgoing, String mes map.put("message", message); return api.callApi("websocket", "action", "sendTextMessage", map); } + + /** + * Sets the text message for an intercepted websockets message + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setBreakTextMessage(String message, String outgoing) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("message", message); + map.put("outgoing", outgoing); + return api.callApi("websocket", "action", "setBreakTextMessage", map); + } } From b9f70058ebe232fd05190ac38548a9124dc5a0e1 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jun 2019 16:34:48 +0100 Subject: [PATCH 081/148] Release 1.7.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3bcd79..92fba66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.7.0] - 2019-06-13 ### Added - Add API for SOAP Scanner add-on, version 3. @@ -99,7 +99,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...HEAD +[1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/zaproxy/zap-api-java/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/zaproxy/zap-api-java/compare/v1.3.0...v1.4.0 diff --git a/README.md b/README.md index df70053..978da38 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.6.0` + * Version: `1.7.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle b/build.gradle index bc7d5c9..1f424e6 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ subprojects { group = 'org.zaproxy' - version '1.7.0-SNAPSHOT' + version '1.7.0' ext.versionBC = '1.6.0' repositories { From fd537bd8ab47f267a121dd61a98b47ba4cfff4d4 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jun 2019 22:33:56 +0100 Subject: [PATCH 082/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++++ build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92fba66..a81122f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + + ## [1.7.0] - 2019-06-13 ### Added - Add API for SOAP Scanner add-on, version 3. @@ -99,6 +102,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...HEAD [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/zaproxy/zap-api-java/compare/v1.4.0...v1.5.0 diff --git a/build.gradle b/build.gradle index 1f424e6..253b57d 100644 --- a/build.gradle +++ b/build.gradle @@ -20,8 +20,8 @@ subprojects { group = 'org.zaproxy' - version '1.7.0' - ext.versionBC = '1.6.0' + version '1.8.0-SNAPSHOT' + ext.versionBC = '1.7.0' repositories { mavenCentral() From 25abef89235b7f62dc057502c48d0ea899f8a1da Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 6 Aug 2019 22:57:26 +0100 Subject: [PATCH 083/148] Use just OpenJDK in Travis CI Replace OracleJDK with OpenJDK, the former is no longer included by default in newer dists (Xenial). Signed-off-by: thc202 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c20f361..8766daf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: java jdk: - - oraclejdk8 + - openjdk8 - openjdk11 before_cache: From 2ff0a1ad3cdaf240a2f70e6e8a346d8ba26eda6d Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 6 Aug 2019 23:09:59 +0100 Subject: [PATCH 084/148] Add more core APIs Add core APIs to manage local proxies and rule configs, already present in 2.8.0. Signed-off-by: thc202 --- CHANGELOG.md | 3 +- .../org/zaproxy/clientapi/core/ClientApi.java | 4 + .../zaproxy/clientapi/gen/LocalProxies.java | 74 +++++++++++++++++++ .../org/zaproxy/clientapi/gen/RuleConfig.java | 71 ++++++++++++++++++ 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/RuleConfig.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a81122f..b6ea578 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] - +### Added +- Core APIs from ZAP version 2.8.0. ## [1.7.0] - 2019-06-13 ### Added diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 0dfb6de..6505e3b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -61,12 +61,14 @@ import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.ImportLogFiles; import org.zaproxy.clientapi.gen.Importurls; +import org.zaproxy.clientapi.gen.LocalProxies; import org.zaproxy.clientapi.gen.Openapi; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; import org.zaproxy.clientapi.gen.Pscan; import org.zaproxy.clientapi.gen.Replacer; import org.zaproxy.clientapi.gen.Reveal; +import org.zaproxy.clientapi.gen.RuleConfig; import org.zaproxy.clientapi.gen.Script; import org.zaproxy.clientapi.gen.Search; import org.zaproxy.clientapi.gen.Selenium; @@ -111,12 +113,14 @@ public class ClientApi { public HttpSessions httpSessions = new HttpSessions(this); public ImportLogFiles logImportFiles = new ImportLogFiles(this); public Importurls importurls = new Importurls(this); + public LocalProxies localProxies = new LocalProxies(this); public Openapi openapi = new Openapi(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); public Pscan pscan = new Pscan(this); public Replacer replacer = new Replacer(this); public Reveal reveal = new Reveal(this); + public RuleConfig ruleConfig = new RuleConfig(this); public Search search = new Search(this); public Script script = new Script(this); public Selenium selenium = new Selenium(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java new file mode 100644 index 0000000..dbcd03e --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java @@ -0,0 +1,74 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2019 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class LocalProxies { + + private final ClientApi api; + + public LocalProxies(ClientApi api) { + this.api = api; + } + + /** Gets all of the additional proxies that have been configured. */ + public ApiResponse additionalProxies() throws ClientApiException { + return api.callApi("localProxies", "view", "additionalProxies", null); + } + + /** Adds an new proxy using the details supplied. */ + public ApiResponse addAdditionalProxy( + String address, + String port, + String behindnat, + String alwaysdecodezip, + String removeunsupportedencodings) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("address", address); + map.put("port", port); + if (behindnat != null) { + map.put("behindNat", behindnat); + } + if (alwaysdecodezip != null) { + map.put("alwaysDecodeZip", alwaysdecodezip); + } + if (removeunsupportedencodings != null) { + map.put("removeUnsupportedEncodings", removeunsupportedencodings); + } + return api.callApi("localProxies", "action", "addAdditionalProxy", map); + } + + /** Removes the additional proxy with the specified address and port. */ + public ApiResponse removeAdditionalProxy(String address, String port) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("address", address); + map.put("port", port); + return api.callApi("localProxies", "action", "removeAdditionalProxy", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/RuleConfig.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/RuleConfig.java new file mode 100644 index 0000000..dc1a7c4 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/RuleConfig.java @@ -0,0 +1,71 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2019 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class RuleConfig { + + private final ClientApi api; + + public RuleConfig(ClientApi api) { + this.api = api; + } + + /** Show the specified rule configuration */ + public ApiResponse ruleConfigValue(String key) throws ClientApiException { + Map map = new HashMap<>(); + map.put("key", key); + return api.callApi("ruleConfig", "view", "ruleConfigValue", map); + } + + /** Show all of the rule configurations */ + public ApiResponse allRuleConfigs() throws ClientApiException { + return api.callApi("ruleConfig", "view", "allRuleConfigs", null); + } + + /** Reset the specified rule configuration, which must already exist */ + public ApiResponse resetRuleConfigValue(String key) throws ClientApiException { + Map map = new HashMap<>(); + map.put("key", key); + return api.callApi("ruleConfig", "action", "resetRuleConfigValue", map); + } + + /** Reset all of the rule configurations */ + public ApiResponse resetAllRuleConfigValues() throws ClientApiException { + return api.callApi("ruleConfig", "action", "resetAllRuleConfigValues", null); + } + + /** Set the specified rule configuration, which must already exist */ + public ApiResponse setRuleConfigValue(String key, String value) throws ClientApiException { + Map map = new HashMap<>(); + map.put("key", key); + if (value != null) { + map.put("value", value); + } + return api.callApi("ruleConfig", "action", "setRuleConfigValue", map); + } +} From 865a7315a9bb792a1e593232c0d6e86232bda904 Mon Sep 17 00:00:00 2001 From: Simon Bennetts Date: Mon, 16 Dec 2019 11:10:12 +0000 Subject: [PATCH 085/148] Refer to the main repo for the help links Signed-off-by: Simon Bennetts --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 978da38..96ffda3 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,7 @@ Previous releases are also available, more details can be found in [Maven Centra For help using OWASP ZAP API refer to: * [Examples](subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples) - collection of examples using the library; - * [OWASP ZAP User Group](https://groups.google.com/group/zaproxy-users) - for asking questions; - * IRC: irc.mozilla.org #websectools (eg [using Mibbit](http://chat.mibbit.com/?server=irc.mozilla.org%3A%2B6697&channel=%23websectools)) - chat with core ZAP developers (European office hours usually best) + * [The help section](https://github.com/zaproxy/zaproxy/blob/develop/README.md#for-help-using-zap) of the main ZAP repo; ## Issues From bf7f6b913cc51793b9e48e656e3779cc78cc751c Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 16 Jan 2020 11:22:43 +0000 Subject: [PATCH 086/148] Update help link Link to the new site. Signed-off-by: thc202 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6ea578..a5d71cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,7 +74,7 @@ the API key) from being used with ZAP versions <= 2.5.0. ## [1.1.0] - 2017-03-09 ### Added - Context Alert Filters API, for more information refer to the help page: -https://github.com/zaproxy/zap-extensions/wiki/HelpAddonsAlertFiltersAlertFilter +https://www.zaproxy.org/docs/desktop/addons/alert-filters/ - The `Alert` now exposes the alert ID, message ID, and scanner ID. - Added confidence "False Positive" (enum `Alert.Confidence`). From 655bb30fb1e0de08924abdb2d9c8fb35a0774bd5 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 21 Jan 2020 12:45:07 +0000 Subject: [PATCH 087/148] Update Gradle plugin for JApicmp Update to latest version and use a detached configuration for the checks. Remove Java version check and manually added input no longer needed. Signed-off-by: thc202 --- .../zap-clientapi/zap-clientapi.gradle | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index ae78359..a589d47 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,7 +1,7 @@ plugins { id "maven-publish" id "signing" - id "me.champeau.gradle.japicmp" version "0.2.6" + id "me.champeau.gradle.japicmp" version "0.2.9" id "org.owasp.dependencycheck" version "3.2.1" } @@ -25,29 +25,25 @@ jar { } } -configurations { - japicmpBaseline -} - -dependencies { - japicmpBaseline ("${project.group}:${project.name}:$versionBC") { force = true } -} - -dependencyCheck { - skipConfigurations += "japicmpBaseline" +File clientapiJar(version) { + def oldGroup = group + try { + // https://discuss.gradle.org/t/is-the-default-configuration-leaking-into-independent-configurations/2088/6 + group = "virtual_group_for_japicmp" + def conf = configurations.detachedConfiguration(dependencies.create("$oldGroup:$name:$version")) + conf.transitive = false + return conf.singleFile + } finally { + group = oldGroup + } } task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { group 'verification' description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." - // XXX Don't run by default with Java 9+, does not work (needs the module java.xml.bind). - if (JavaVersion.current() == JavaVersion.VERSION_1_8) { - check.dependsOn 'japicmp' - } - inputs.files(jar) - oldClasspath = configurations.japicmpBaseline - newClasspath = configurations.runtimeClasspath + files(jar) + oldClasspath = files(clientapiJar(versionBC)) + newClasspath = files(tasks.named(JavaPlugin.JAR_TASK_NAME).map { it.archivePath }) onlyBinaryIncompatibleModified = true failOnModification = true ignoreMissingClasses = true From 929ac5c3ac2f66f270d1af6c3d237a9dbeb2ff42 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 21 Jan 2020 22:23:50 +0000 Subject: [PATCH 088/148] Regenerate APIs Regenerate core and add-ons APIs. Signed-off-by: thc202 --- CHANGELOG.md | 12 + .../org/zaproxy/clientapi/core/ClientApi.java | 8 + .../zaproxy/clientapi/gen/AccessControl.java | 103 +++++++++ .../java/org/zaproxy/clientapi/gen/Alert.java | 101 +++++++++ .../zaproxy/clientapi/gen/AlertFilter.java | 208 ++++++++++++++++++ .../org/zaproxy/clientapi/gen/Autoupdate.java | 4 +- .../java/org/zaproxy/clientapi/gen/Break.java | 10 +- .../java/org/zaproxy/clientapi/gen/Core.java | 6 +- .../zaproxy/clientapi/gen/Exportreport.java | 67 ++++++ .../org/zaproxy/clientapi/gen/Openapi.java | 16 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 10 + .../org/zaproxy/clientapi/gen/Replacer.java | 2 +- .../org/zaproxy/clientapi/gen/Revisit.java | 59 +++++ .../org/zaproxy/clientapi/gen/Script.java | 55 +++++ .../org/zaproxy/clientapi/gen/Spider.java | 2 + .../org/zaproxy/clientapi/gen/Wappalyzer.java | 66 ++++++ 16 files changed, 715 insertions(+), 14 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AccessControl.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Revisit.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a5d71cf..3a09ed7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added - Core APIs from ZAP version 2.8.0. +- APIs from add-ons: + - Access Control Testing; + - Export Report; + - Revisit; + - Wappalyzer - Technology Detection. + +### Changed +- Core APIs updated for ZAP version 2.9.0. +- Update APIs from add-ons: + - Alert Filters; + - OpenAPI Support; + - Replacer. ## [1.7.0] - 2019-06-13 ### Added diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 6505e3b..9fdb1ec 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -47,6 +47,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; +import org.zaproxy.clientapi.gen.AccessControl; import org.zaproxy.clientapi.gen.Acsrf; import org.zaproxy.clientapi.gen.AjaxSpider; import org.zaproxy.clientapi.gen.AlertFilter; @@ -57,6 +58,7 @@ import org.zaproxy.clientapi.gen.Break; import org.zaproxy.clientapi.gen.Context; import org.zaproxy.clientapi.gen.Core; +import org.zaproxy.clientapi.gen.Exportreport; import org.zaproxy.clientapi.gen.ForcedUser; import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.ImportLogFiles; @@ -68,6 +70,7 @@ import org.zaproxy.clientapi.gen.Pscan; import org.zaproxy.clientapi.gen.Replacer; import org.zaproxy.clientapi.gen.Reveal; +import org.zaproxy.clientapi.gen.Revisit; import org.zaproxy.clientapi.gen.RuleConfig; import org.zaproxy.clientapi.gen.Script; import org.zaproxy.clientapi.gen.Search; @@ -77,6 +80,7 @@ import org.zaproxy.clientapi.gen.Spider; import org.zaproxy.clientapi.gen.Stats; import org.zaproxy.clientapi.gen.Users; +import org.zaproxy.clientapi.gen.Wappalyzer; import org.zaproxy.clientapi.gen.Websocket; public class ClientApi { @@ -98,6 +102,7 @@ public class ClientApi { private DocumentBuilderFactory docBuilderFactory; // Note that any new API implementations added have to be added here manually + public AccessControl accessControl = new AccessControl(this); public Acsrf acsrf = new Acsrf(this); public AjaxSpider ajaxSpider = new AjaxSpider(this); public AlertFilter alertFilter = new AlertFilter(this); @@ -109,6 +114,7 @@ public class ClientApi { public Break brk = new Break(this); public Context context = new Context(this); public Core core = new Core(this); + public Exportreport exportreport = new Exportreport(this); public ForcedUser forcedUser = new ForcedUser(this); public HttpSessions httpSessions = new HttpSessions(this); public ImportLogFiles logImportFiles = new ImportLogFiles(this); @@ -120,6 +126,7 @@ public class ClientApi { public Pscan pscan = new Pscan(this); public Replacer replacer = new Replacer(this); public Reveal reveal = new Reveal(this); + public Revisit revisit = new Revisit(this); public RuleConfig ruleConfig = new RuleConfig(this); public Search search = new Search(this); public Script script = new Script(this); @@ -129,6 +136,7 @@ public class ClientApi { public Spider spider = new Spider(this); public Stats stats = new Stats(this); public Users users = new Users(this); + public Wappalyzer wappalyzer = new Wappalyzer(this); public Websocket websocket = new Websocket(this); public ClientApi(String zapAddress, int zapPort) { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AccessControl.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AccessControl.java new file mode 100644 index 0000000..5ddd26e --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AccessControl.java @@ -0,0 +1,103 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2020 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class AccessControl { + + private final ClientApi api; + + public AccessControl(ClientApi api) { + this.api = api; + } + + /** + * Gets the Access Control scan progress (percentage integer) for the given context ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getScanProgress(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("accessControl", "view", "getScanProgress", map); + } + + /** + * Gets the Access Control scan status (description string) for the given context ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getScanStatus(String contextid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + return api.callApi("accessControl", "view", "getScanStatus", map); + } + + /** + * Starts an Access Control scan with the given context ID and user ID. (Optional parameters: + * user ID for Unauthenticated user, boolean identifying whether or not Alerts are raised, and + * the Risk level for the Alerts.) [This assumes the Access Control rules were previously + * established via ZAP gui and the necessary Context exported/imported.] + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse scan( + String contextid, + String userid, + String scanasunauthuser, + String raisealert, + String alertrisklevel) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + if (scanasunauthuser != null) { + map.put("scanAsUnAuthUser", scanasunauthuser); + } + if (raisealert != null) { + map.put("raiseAlert", raisealert); + } + if (alertrisklevel != null) { + map.put("alertRiskLevel", alertrisklevel); + } + return api.callApi("accessControl", "action", "scan", map); + } + + /** + * Generates an Access Control report for the given context ID and saves it based on the + * provided filename (path). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse writeHTMLreport(String contextid, String filename) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("fileName", filename); + return api.callApi("accessControl", "action", "writeHTMLreport", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java index 2ba20dd..16673f9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java @@ -127,4 +127,105 @@ public ApiResponse deleteAlert(String id) throws ClientApiException { map.put("id", id); return api.callApi("alert", "action", "deleteAlert", map); } + + /** Update the alert with the given ID, with the provided details. */ + public ApiResponse updateAlert( + String id, + String name, + String riskid, + String confidenceid, + String description, + String param, + String attack, + String otherinfo, + String solution, + String references, + String evidence, + String cweid, + String wascid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("id", id); + map.put("name", name); + map.put("riskId", riskid); + map.put("confidenceId", confidenceid); + map.put("description", description); + if (param != null) { + map.put("param", param); + } + if (attack != null) { + map.put("attack", attack); + } + if (otherinfo != null) { + map.put("otherInfo", otherinfo); + } + if (solution != null) { + map.put("solution", solution); + } + if (references != null) { + map.put("references", references); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (cweid != null) { + map.put("cweId", cweid); + } + if (wascid != null) { + map.put("wascId", wascid); + } + return api.callApi("alert", "action", "updateAlert", map); + } + + /** + * Add an alert associated with the given message ID, with the provided details. (The ID of the + * created alert is returned.) + */ + public ApiResponse addAlert( + String messageid, + String name, + String riskid, + String confidenceid, + String description, + String param, + String attack, + String otherinfo, + String solution, + String references, + String evidence, + String cweid, + String wascid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("messageId", messageid); + map.put("name", name); + map.put("riskId", riskid); + map.put("confidenceId", confidenceid); + map.put("description", description); + if (param != null) { + map.put("param", param); + } + if (attack != null) { + map.put("attack", attack); + } + if (otherinfo != null) { + map.put("otherInfo", otherinfo); + } + if (solution != null) { + map.put("solution", solution); + } + if (references != null) { + map.put("references", references); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (cweid != null) { + map.put("cweId", cweid); + } + if (wascid != null) { + map.put("wascId", wascid); + } + return api.callApi("alert", "action", "addAlert", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 9512cbb..7174261 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -46,6 +46,14 @@ public ApiResponse alertFilterList(String contextid) throws ClientApiException { return api.callApi("alertFilter", "view", "alertFilterList", map); } + /** + * Lists the global alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse globalAlertFilterList() throws ClientApiException { + return api.callApi("alertFilter", "view", "globalAlertFilterList", null); + } /** * Adds a new alert filter for the context with the given ID. * @@ -60,6 +68,40 @@ public ApiResponse addAlertFilter( String parameter, String enabled) throws ClientApiException { + return addAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + null, + null, + null, + null, + null); + } + + /** + * Adds a new alert filter for the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); map.put("ruleId", ruleid); @@ -76,6 +118,21 @@ public ApiResponse addAlertFilter( if (enabled != null) { map.put("enabled", enabled); } + if (parameterisregex != null) { + map.put("parameterIsRegex", parameterisregex); + } + if (attack != null) { + map.put("attack", attack); + } + if (attackisregex != null) { + map.put("attackIsRegex", attackisregex); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (evidenceisregex != null) { + map.put("evidenceIsRegex", evidenceisregex); + } return api.callApi("alertFilter", "action", "addAlertFilter", map); } @@ -93,6 +150,40 @@ public ApiResponse removeAlertFilter( String parameter, String enabled) throws ClientApiException { + return removeAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + null, + null, + null, + null, + null); + } + + /** + * Removes an alert filter from the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); map.put("ruleId", ruleid); @@ -109,6 +200,123 @@ public ApiResponse removeAlertFilter( if (enabled != null) { map.put("enabled", enabled); } + if (parameterisregex != null) { + map.put("parameterIsRegex", parameterisregex); + } + if (attack != null) { + map.put("attack", attack); + } + if (attackisregex != null) { + map.put("attackIsRegex", attackisregex); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (evidenceisregex != null) { + map.put("evidenceIsRegex", evidenceisregex); + } return api.callApi("alertFilter", "action", "removeAlertFilter", map); } + + /** + * Adds a new global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + if (parameterisregex != null) { + map.put("parameterIsRegex", parameterisregex); + } + if (attack != null) { + map.put("attack", attack); + } + if (attackisregex != null) { + map.put("attackIsRegex", attackisregex); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (evidenceisregex != null) { + map.put("evidenceIsRegex", evidenceisregex); + } + return api.callApi("alertFilter", "action", "addGlobalAlertFilter", map); + } + + /** + * Removes a global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("ruleId", ruleid); + map.put("newLevel", newlevel); + if (url != null) { + map.put("url", url); + } + if (urlisregex != null) { + map.put("urlIsRegex", urlisregex); + } + if (parameter != null) { + map.put("parameter", parameter); + } + if (enabled != null) { + map.put("enabled", enabled); + } + if (parameterisregex != null) { + map.put("parameterIsRegex", parameterisregex); + } + if (attack != null) { + map.put("attack", attack); + } + if (attackisregex != null) { + map.put("attackIsRegex", attackisregex); + } + if (evidence != null) { + map.put("evidence", evidence); + } + if (evidenceisregex != null) { + map.put("evidenceIsRegex", evidenceisregex); + } + return api.callApi("alertFilter", "action", "removeGlobalAlertFilter", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java index 6e7d1a2..991b154 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Autoupdate.java @@ -137,7 +137,9 @@ public ApiResponse downloadLatestRelease() throws ClientApiException { return api.callApi("autoupdate", "action", "downloadLatestRelease", null); } - /** Installs or updates the specified add-on, returning when complete (ie not asynchronously) */ + /** + * Installs or updates the specified add-on, returning when complete (i.e. not asynchronously) + */ public ApiResponse installAddon(String id) throws ClientApiException { Map map = new HashMap<>(); map.put("id", id); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java index 245efca..d47af9e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Break.java @@ -83,7 +83,7 @@ public ApiResponse setHttpMessage(String httpheader, String httpbody) } /** - * Submits the currently intercepted message and unsets the global request/response break points + * Submits the currently intercepted message and unsets the global request/response breakpoints */ public ApiResponse cont() throws ClientApiException { return api.callApi("break", "action", "continue", null); @@ -103,9 +103,9 @@ public ApiResponse drop() throws ClientApiException { } /** - * Adds a custom HTTP breakpont. The string is the string to match. Location may be one of: url, - * request_header, request_body, response_header or response_body. Match may be: contains or - * regex. Inverse (match) may be true or false. Lastly, ignorecase (when matching the string) + * Adds a custom HTTP breakpoint. The string is the string to match. Location may be one of: + * url, request_header, request_body, response_header or response_body. Match may be: contains + * or regex. Inverse (match) may be true or false. Lastly, ignorecase (when matching the string) * may be true or false. */ public ApiResponse addHttpBreakpoint( @@ -120,7 +120,7 @@ public ApiResponse addHttpBreakpoint( return api.callApi("break", "action", "addHttpBreakpoint", map); } - /** Removes the specified break point */ + /** Removes the specified breakpoint */ public ApiResponse removeHttpBreakpoint( String string, String location, String match, String inverse, String ignorecase) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index cae5390..7612191 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -366,11 +366,7 @@ public ApiResponse loadSession(String name) throws ClientApiException { return api.callApi("core", "action", "loadSession", map); } - /** - * Saves the session with the name supplied, optionally overwriting existing files. If a - * relative path is specified it will be resolved against the "session" directory in ZAP "home" - * dir. - */ + /** Saves the session. */ public ApiResponse saveSession(String name, String overwrite) throws ClientApiException { Map map = new HashMap<>(); map.put("name", name); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java new file mode 100644 index 0000000..0a4d326 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java @@ -0,0 +1,67 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2020 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Exportreport { + + private final ClientApi api; + + public Exportreport(ClientApi api) { + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse formats() throws ClientApiException { + return api.callApi("exportreport", "view", "formats", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse generate( + String absolutepath, + String fileextension, + String sourcedetails, + String alertseverity, + String alertdetails, + String scanid, + String includepassivealerts) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("absolutePath", absolutepath); + map.put("fileExtension", fileextension); + map.put("sourceDetails", sourcedetails); + map.put("alertSeverity", alertseverity); + map.put("alertDetails", alertdetails); + if (scanid != null) { + map.put("scanId", scanid); + } + if (includepassivealerts != null) { + map.put("includePassiveAlerts", includepassivealerts); + } + return api.callApi("exportreport", "action", "generate", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index a6f529d..e72a191 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -36,18 +36,30 @@ public Openapi(ClientApi api) { } /** - * Import an Open API definition from a local file. + * Imports an Open API definition from a local file. * *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse importFile(String file) throws ClientApiException { + return importFile(file, null); + } + + /** + * Imports an OpenAPI definition from a local file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file, String target) throws ClientApiException { Map map = new HashMap<>(); map.put("file", file); + if (target != null) { + map.put("target", target); + } return api.callApi("openapi", "action", "importFile", map); } /** - * Import an Open API definition from a URL, hostOverride allows the host to be replaced + * Imports an OpenAPI definition from a URL. * *

This component is optional and therefore the API will only work if it is installed */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index b2a4e93..fb21b58 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -124,4 +124,14 @@ public ApiResponse setMaxAlertsPerRule(String maxalerts) throws ClientApiExcepti map.put("maxAlerts", maxalerts); return api.callApi("pscan", "action", "setMaxAlertsPerRule", map); } + + /** Disables all passive scan tags. */ + public ApiResponse disableAllTags() throws ClientApiException { + return api.callApi("pscan", "action", "disableAllTags", null); + } + + /** Enables all passive scan tags. */ + public ApiResponse enableAllTags() throws ClientApiException { + return api.callApi("pscan", "action", "enableAllTags", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 3df143b..43089f0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -51,7 +51,7 @@ public ApiResponse rules() throws ClientApiException { * treated as a regex otherwise false, matchString is the string that will be matched against, * replacement is the replacement string, initiators may be blank (for all initiators) or a * comma separated list of integers as defined in HttpSender + * href="https://github.com/zaproxy/zaproxy/blob/develop/zap/src/main/java/org/parosproxy/paros/network/HttpSender.java">HttpSender * *

This component is optional and therefore the API will only work if it is installed */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Revisit.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Revisit.java new file mode 100644 index 0000000..5626c86 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Revisit.java @@ -0,0 +1,59 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2020 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Revisit { + + private final ClientApi api; + + public Revisit(ClientApi api) { + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse revisitList() throws ClientApiException { + return api.callApi("revisit", "view", "revisitList", null); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse revisitSiteOn(String site, String starttime, String endtime) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + map.put("startTime", starttime); + map.put("endTime", endtime); + return api.callApi("revisit", "action", "revisitSiteOn", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse revisitSiteOff(String site) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + return api.callApi("revisit", "action", "revisitSiteOff", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 6af85e1..352cb76 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -62,11 +62,29 @@ public ApiResponse globalVar(String varkey) throws ClientApiException { return api.callApi("script", "view", "globalVar", map); } + /** + * Gets the value (string representation) of a global custom variable. Returns an API error + * (DOES_NOT_EXIST) if no value was previously set. + */ + public ApiResponse globalCustomVar(String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("varKey", varkey); + return api.callApi("script", "view", "globalCustomVar", map); + } + /** Gets all the global variables (key/value pairs). */ public ApiResponse globalVars() throws ClientApiException { return api.callApi("script", "view", "globalVars", null); } + /** + * Gets all the global custom variables (key/value pairs, the value is the string + * representation). + */ + public ApiResponse globalCustomVars() throws ClientApiException { + return api.callApi("script", "view", "globalCustomVars", null); + } + /** * Gets the value of the variable with the given key for the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists or if no value was previously set. @@ -78,6 +96,17 @@ public ApiResponse scriptVar(String scriptname, String varkey) throws ClientApiE return api.callApi("script", "view", "scriptVar", map); } + /** + * Gets the value (string representation) of a custom variable. Returns an API error + * (DOES_NOT_EXIST) if no script with the given name exists or if no value was previously set. + */ + public ApiResponse scriptCustomVar(String scriptname, String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("varKey", varkey); + return api.callApi("script", "view", "scriptCustomVar", map); + } + /** * Gets all the variables (key/value pairs) of the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists. @@ -88,6 +117,16 @@ public ApiResponse scriptVars(String scriptname) throws ClientApiException { return api.callApi("script", "view", "scriptVars", map); } + /** + * Gets all the custom variables (key/value pairs, the value is the string representation) of a + * script. Returns an API error (DOES_NOT_EXIST) if no script with the given name exists. + */ + public ApiResponse scriptCustomVars(String scriptname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + return api.callApi("script", "view", "scriptCustomVars", map); + } + /** Enables the script with the given name */ public ApiResponse enable(String scriptname) throws ClientApiException { Map map = new HashMap<>(); @@ -150,6 +189,13 @@ public ApiResponse clearGlobalVar(String varkey) throws ClientApiException { return api.callApi("script", "action", "clearGlobalVar", map); } + /** Clears a global custom variable. */ + public ApiResponse clearGlobalCustomVar(String varkey) throws ClientApiException { + Map map = new HashMap<>(); + map.put("varKey", varkey); + return api.callApi("script", "action", "clearGlobalCustomVar", map); + } + /** Clears the global variables. */ public ApiResponse clearGlobalVars() throws ClientApiException { return api.callApi("script", "action", "clearGlobalVars", null); @@ -166,6 +212,15 @@ public ApiResponse clearScriptVar(String scriptname, String varkey) throws Clien return api.callApi("script", "action", "clearScriptVar", map); } + /** Clears a script custom variable. */ + public ApiResponse clearScriptCustomVar(String scriptname, String varkey) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptName", scriptname); + map.put("varKey", varkey); + return api.callApi("script", "action", "clearScriptCustomVar", map); + } + /** * Clears the variables of the given script. Returns an API error (DOES_NOT_EXIST) if no script * with the given name exists. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 5d27f2e..2e54c0b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -143,11 +143,13 @@ public ApiResponse optionRequestWaitTime() throws ClientApiException { return api.callApi("spider", "view", "optionRequestWaitTime", null); } + /** @deprecated Option no longer in effective use. */ @Deprecated public ApiResponse optionScope() throws ClientApiException { return api.callApi("spider", "view", "optionScope", null); } + /** @deprecated Option no longer in effective use. */ @Deprecated public ApiResponse optionScopeText() throws ClientApiException { return api.callApi("spider", "view", "optionScopeText", null); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java new file mode 100644 index 0000000..1a655fe --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java @@ -0,0 +1,66 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2020 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Wappalyzer { + + private final ClientApi api; + + public Wappalyzer(ClientApi api) { + this.api = api; + } + + /** + * Lists all the sites recognized by the wappalyzer addon. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse listSites() throws ClientApiException { + return api.callApi("wappalyzer", "view", "listSites", null); + } + + /** + * Lists all sites and their associated applications (technologies). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse listAll() throws ClientApiException { + return api.callApi("wappalyzer", "view", "listAll", null); + } + + /** + * Lists all the applications (technologies) associated with a specific site. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse listSite(String site) throws ClientApiException { + Map map = new HashMap<>(); + map.put("site", site); + return api.callApi("wappalyzer", "view", "listSite", map); + } +} From 092f82464d149aa254de5032f15c819151ed16f3 Mon Sep 17 00:00:00 2001 From: thc202 Date: Wed, 22 Jan 2020 21:19:35 +0000 Subject: [PATCH 089/148] Release 1.8.0 Update version, readme, and changelog for new release. Update readme to link to the site and replace outdated information. Signed-off-by: thc202 --- CHANGELOG.md | 6 +++--- README.md | 7 ++++--- build.gradle | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a09ed7..bf4236b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.8.0] - 2020-01-23 ### Added -- Core APIs from ZAP version 2.8.0. +- Core APIs. - APIs from add-ons: - Access Control Testing; - Export Report; @@ -115,7 +115,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...HEAD +[1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/zaproxy/zap-api-java/compare/v1.4.0...v1.5.0 diff --git a/README.md b/README.md index 96ffda3..fa0b19f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Build Status](https://api.travis-ci.com/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.com/zaproxy/zap-api-java) [![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) -The Java implementation to access the [OWASP ZAP API](https://github.com/zaproxy/zaproxy/wiki/ApiDetails). For more information +The Java implementation to access the [OWASP ZAP API](https://www.zaproxy.org/docs/api/). For more information about OWASP ZAP consult the (main) [OWASP ZAP project](https://github.com/zaproxy/zaproxy/). This project produces two libraries: @@ -22,7 +22,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.7.0` + * Version: `1.8.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). @@ -30,7 +30,8 @@ Previous releases are also available, more details can be found in [Maven Centra For help using OWASP ZAP API refer to: * [Examples](subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples) - collection of examples using the library; - * [The help section](https://github.com/zaproxy/zaproxy/blob/develop/README.md#for-help-using-zap) of the main ZAP repo; + * [API Documentation](https://www.zaproxy.org/docs/api/) + * [OWASP ZAP User Group](https://groups.google.com/group/zaproxy-users) - for asking questions ## Issues diff --git a/build.gradle b/build.gradle index 253b57d..91603a5 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ subprojects { group = 'org.zaproxy' - version '1.8.0-SNAPSHOT' + version '1.8.0' ext.versionBC = '1.7.0' repositories { From 0149be2d4004535490734eb2590a186bfb478b3a Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 23 Jan 2020 11:05:23 +0000 Subject: [PATCH 090/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++++ build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf4236b..739ce06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + + ## [1.8.0] - 2020-01-23 ### Added - Core APIs. @@ -115,6 +118,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...HEAD [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 diff --git a/build.gradle b/build.gradle index 91603a5..1585c52 100644 --- a/build.gradle +++ b/build.gradle @@ -20,8 +20,8 @@ subprojects { group = 'org.zaproxy' - version '1.8.0' - ext.versionBC = '1.7.0' + version '1.9.0-SNAPSHOT' + ext.versionBC = '1.8.0' repositories { mavenCentral() From 07510c3546e3267d41ae7302d20c2dd5ca1d53a9 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 30 Jan 2020 10:48:28 +0000 Subject: [PATCH 091/148] Update link in the POM Link to the site instead of the OWASP wiki page. Signed-off-by: thc202 --- subprojects/zap-clientapi/zap-clientapi.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index a589d47..b6c0d30 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -107,7 +107,7 @@ publishing { organization { name = 'OWASP' - url = 'https://www.owasp.org/index.php/ZAP' + url = 'https://www.zaproxy.org/' } mailingLists { From e06bfc61695ec39d36ed97c0d4642c3f2a08cc7e Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 18 Dec 2020 17:11:20 +0000 Subject: [PATCH 092/148] Regenerate APIs and release 1.9.0 Regenerate core and add-ons APIs. Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 9 +- README.md | 2 +- build.gradle | 2 +- .../java/org/zaproxy/clientapi/gen/Acsrf.java | 12 ++ .../org/zaproxy/clientapi/gen/AjaxSpider.java | 41 +++- .../java/org/zaproxy/clientapi/gen/Alert.java | 17 ++ .../org/zaproxy/clientapi/gen/Context.java | 34 ++++ .../java/org/zaproxy/clientapi/gen/Core.java | 12 ++ .../org/zaproxy/clientapi/gen/Graphql.java | 183 ++++++++++++++++++ .../java/org/zaproxy/clientapi/gen/Users.java | 98 ++++++++++ 10 files changed, 398 insertions(+), 12 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 739ce06..a89d5e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.9.0] - 2020-12-18 +### Added +- Add API from GraphQL add-on. +### Changed +- Core APIs updated for ZAP version 2.10.0. +- Update API from AJAX Spider add.on. ## [1.8.0] - 2020-01-23 ### Added @@ -118,7 +123,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...HEAD +[1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/zaproxy/zap-api-java/compare/v1.5.0...v1.6.0 diff --git a/README.md b/README.md index fa0b19f..9127bdf 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.8.0` + * Version: `1.9.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle b/build.gradle index 1585c52..85db210 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ subprojects { group = 'org.zaproxy' - version '1.9.0-SNAPSHOT' + version '1.9.0' ext.versionBC = '1.8.0' repositories { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index e073333..5cbe601 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -41,6 +41,11 @@ public ApiResponse optionTokensNames() throws ClientApiException { return api.callApi("acsrf", "view", "optionTokensNames", null); } + /** Define if ZAP should detect CSRF tokens by searching for partial matches */ + public ApiResponse optionPartialMatchingEnabled() throws ClientApiException { + return api.callApi("acsrf", "view", "optionPartialMatchingEnabled", null); + } + /** Adds an anti-CSRF token with the given name, enabled by default */ public ApiResponse addOptionToken(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -55,6 +60,13 @@ public ApiResponse removeOptionToken(String string) throws ClientApiException { return api.callApi("acsrf", "action", "removeOptionToken", map); } + /** Define if ZAP should detect CSRF tokens by searching for partial matches. */ + public ApiResponse setOptionPartialMatchingEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("acsrf", "action", "setOptionPartialMatchingEnabled", map); + } + /** Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ public byte[] genForm(String hrefid) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 3b3d647..380bae0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -36,6 +36,11 @@ public AjaxSpider(ClientApi api) { this.api = api; } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse allowedResources() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "allowedResources", null); + } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse status() throws ClientApiException { return api.callApi("ajaxSpider", "view", "status", null); @@ -114,10 +119,7 @@ public ApiResponse optionRandomInputs() throws ClientApiException { } /** - * Runs the spider against the given URL and/or context, optionally, spidering everything in - * scope. The parameter 'contextName' can be used to constrain the scan to a Context, the option - * 'in scope' is ignored if a context was also specified. The parameter 'subtreeOnly' allows to - * restrict the spider under a site's subtree (using the specified 'url'). + * Runs the AJAX Spider against a given target. * *

This component is optional and therefore the API will only work if it is installed */ @@ -140,10 +142,7 @@ public ApiResponse scan(String url, String inscope, String contextname, String s } /** - * Runs the spider from the perspective of a User, obtained using the given context name and - * user name. The parameter 'url' allows to specify the starting point for the spider, otherwise - * it's used an existing URL from the context (if any). The parameter 'subtreeOnly' allows to - * restrict the spider under a site's subtree (using the specified 'url'). + * Runs the AJAX Spider from the perspective of a User of the web application. * *

This component is optional and therefore the API will only work if it is installed */ @@ -167,6 +166,32 @@ public ApiResponse stop() throws ClientApiException { return api.callApi("ajaxSpider", "action", "stop", null); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse addAllowedResource(String regex, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("ajaxSpider", "action", "addAllowedResource", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse removeAllowedResource(String regex) throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + return api.callApi("ajaxSpider", "action", "removeAllowedResource", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setEnabledAllowedResource(String regex, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + map.put("enabled", enabled); + return api.callApi("ajaxSpider", "action", "setEnabledAllowedResource", map); + } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionBrowserId(String string) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java index 16673f9..864d284 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java @@ -128,6 +128,23 @@ public ApiResponse deleteAlert(String id) throws ClientApiException { return api.callApi("alert", "action", "deleteAlert", map); } + /** Update the confidence of the alerts. */ + public ApiResponse updateAlertsConfidence(String ids, String confidenceid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + map.put("confidenceId", confidenceid); + return api.callApi("alert", "action", "updateAlertsConfidence", map); + } + + /** Update the risk of the alerts. */ + public ApiResponse updateAlertsRisk(String ids, String riskid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + map.put("riskId", riskid); + return api.callApi("alert", "action", "updateAlertsRisk", map); + } + /** Update the alert with the given ID, with the provided details. */ public ApiResponse updateAlert( String id, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java index 352f960..c9d325d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Context.java @@ -116,6 +116,40 @@ public ApiResponse setContextRegexs(String contextname, String incregexs, String return api.callApi("context", "action", "setContextRegexs", map); } + /** + * Set the checking strategy for a context - this defines how ZAP checks that a request is + * authenticated + */ + public ApiResponse setContextCheckingStrategy( + String contextname, + String checkingstrategy, + String pollurl, + String polldata, + String pollheaders, + String pollfrequency, + String pollfrequencyunits) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("checkingStrategy", checkingstrategy); + if (pollurl != null) { + map.put("pollUrl", pollurl); + } + if (polldata != null) { + map.put("pollData", polldata); + } + if (pollheaders != null) { + map.put("pollHeaders", pollheaders); + } + if (pollfrequency != null) { + map.put("pollFrequency", pollfrequency); + } + if (pollfrequencyunits != null) { + map.put("pollFrequencyUnits", pollfrequencyunits); + } + return api.callApi("context", "action", "setContextCheckingStrategy", map); + } + /** Creates a new context with the given name in the current session */ public ApiResponse newContext(String contextname) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 7612191..6408c69 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -322,6 +322,11 @@ public ApiResponse optionUseProxyChainAuth() throws ClientApiException { return api.callApi("core", "view", "optionUseProxyChainAuth", null); } + /** Gets whether or not the SOCKS proxy should be used. */ + public ApiResponse optionUseSocksProxy() throws ClientApiException { + return api.callApi("core", "view", "optionUseSocksProxy", null); + } + /** * Convenient and simple action to access a URL, optionally following redirections. Returns the * request sent and response received and followed redirections, if any. Other actions are @@ -688,6 +693,13 @@ public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiExce return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); } + /** Sets whether or not the SOCKS proxy should be used. */ + public ApiResponse setOptionUseSocksProxy(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionUseSocksProxy", map); + } + public byte[] proxypac() throws ClientApiException { return api.callApiOther("core", "other", "proxy.pac", null); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java new file mode 100644 index 0000000..43be0e7 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java @@ -0,0 +1,183 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2020 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Graphql { + + private final ClientApi api; + + public Graphql(ClientApi api) { + this.api = api; + } + + /** + * Returns how arguments are currently specified. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionArgsType() throws ClientApiException { + return api.callApi("graphql", "view", "optionArgsType", null); + } + + /** + * Returns the current maximum arguments generation depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionMaxArgsDepth() throws ClientApiException { + return api.callApi("graphql", "view", "optionMaxArgsDepth", null); + } + + /** + * Returns the current maximum query generation depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionMaxQueryDepth() throws ClientApiException { + return api.callApi("graphql", "view", "optionMaxQueryDepth", null); + } + + /** + * Returns whether or not optional arguments are currently specified. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionOptionalArgsEnabled() throws ClientApiException { + return api.callApi("graphql", "view", "optionOptionalArgsEnabled", null); + } + + /** + * Returns the current level for which a single query is generated. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionQuerySplitType() throws ClientApiException { + return api.callApi("graphql", "view", "optionQuerySplitType", null); + } + + /** + * Returns the current request method. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionRequestMethod() throws ClientApiException { + return api.callApi("graphql", "view", "optionRequestMethod", null); + } + + /** + * Imports a GraphQL Schema from a File. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String endurl, String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("endurl", endurl); + map.put("file", file); + return api.callApi("graphql", "action", "importFile", map); + } + + /** + * Imports a GraphQL Schema from a URL. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String endurl, String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("endurl", endurl); + if (url != null) { + map.put("url", url); + } + return api.callApi("graphql", "action", "importUrl", map); + } + + /** + * Sets how arguments are specified. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionArgsType(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("graphql", "action", "setOptionArgsType", map); + } + + /** + * Sets the level for which a single query is generated. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionQuerySplitType(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("graphql", "action", "setOptionQuerySplitType", map); + } + + /** + * Sets the request method. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionRequestMethod(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("graphql", "action", "setOptionRequestMethod", map); + } + + /** + * Sets the maximum arguments generation depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionMaxArgsDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("graphql", "action", "setOptionMaxArgsDepth", map); + } + + /** + * Sets the maximum query generation depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionMaxQueryDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("graphql", "action", "setOptionMaxQueryDepth", map); + } + + /** + * Sets whether or not Optional Arguments should be specified. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionOptionalArgsEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("graphql", "action", "setOptionOptionalArgsEnabled", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java index 1a43f70..a84056a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Users.java @@ -78,6 +78,30 @@ public ApiResponse getAuthenticationCredentials(String contextid, String userid) return api.callApi("users", "view", "getAuthenticationCredentials", map); } + /** + * Gets the authentication state information for the user identified by the Context and User + * Ids. + */ + public ApiResponse getAuthenticationState(String contextid, String userid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "view", "getAuthenticationState", map); + } + + /** + * Gets the authentication session information for the user identified by the Context and User + * Ids, e.g. cookies and realm credentials. + */ + public ApiResponse getAuthenticationSession(String contextid, String userid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "view", "getAuthenticationSession", map); + } + /** Creates a new user with the given name for the context with the given ID. */ public ApiResponse newUser(String contextid, String name) throws ClientApiException { Map map = new HashMap<>(); @@ -132,4 +156,78 @@ public ApiResponse setAuthenticationCredentials( } return api.callApi("users", "action", "setAuthenticationCredentials", map); } + + /** + * Tries to authenticate as the identified user, returning the authentication request and + * whether it appears to have succeeded. + */ + public ApiResponse authenticateAsUser(String contextid, String userid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "action", "authenticateAsUser", map); + } + + /** + * Tries to poll as the identified user, returning the authentication request and whether it + * appears to have succeeded. This will only work if the polling verification strategy has been + * configured. + */ + public ApiResponse pollAsUser(String contextid, String userid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + return api.callApi("users", "action", "pollAsUser", map); + } + + /** + * Sets fields in the authentication state for the user identified by the Context and User Ids. + */ + public ApiResponse setAuthenticationState( + String contextid, + String userid, + String lastpollresult, + String lastpolltimeinms, + String requestssincelastpoll) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + if (lastpollresult != null) { + map.put("lastPollResult", lastpollresult); + } + if (lastpolltimeinms != null) { + map.put("lastPollTimeInMs", lastpolltimeinms); + } + if (requestssincelastpoll != null) { + map.put("requestsSinceLastPoll", requestssincelastpoll); + } + return api.callApi("users", "action", "setAuthenticationState", map); + } + + /** Sets the specified cookie for the user identified by the Context and User Ids. */ + public ApiResponse setCookie( + String contextid, + String userid, + String domain, + String name, + String value, + String path, + String secure) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextId", contextid); + map.put("userId", userid); + map.put("domain", domain); + map.put("name", name); + map.put("value", value); + if (path != null) { + map.put("path", path); + } + if (secure != null) { + map.put("secure", secure); + } + return api.callApi("users", "action", "setCookie", map); + } } From 826a5f0094e86228573c8688f7b9c91411c26fe6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 1 Feb 2021 17:23:29 +0000 Subject: [PATCH 093/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++++ build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a89d5e6..bf60b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + + ## [1.9.0] - 2020-12-18 ### Added - Add API from GraphQL add-on. @@ -123,6 +126,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...HEAD [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 diff --git a/build.gradle b/build.gradle index 85db210..a2cc146 100644 --- a/build.gradle +++ b/build.gradle @@ -20,8 +20,8 @@ subprojects { group = 'org.zaproxy' - version '1.9.0' - ext.versionBC = '1.8.0' + version '1.10.0' + ext.versionBC = '1.9.0' repositories { mavenCentral() From 2298708fade07569ce900e51edac5a0067376ed3 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 1 Feb 2021 17:47:29 +0000 Subject: [PATCH 094/148] Run CI checks with GitHub workflow Add workflow to run CI checks with GitHub. Remove Travis CI configuration. Remove Travis CI reference in README. Signed-off-by: thc202 --- .github/workflows/ci.yml | 31 +++++++++++++++++++++++++++++++ .travis.yml | 13 ------------- README.md | 1 - 3 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a836beb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: Java CI + +on: + push: + branches: + - main + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + java: [8, 11] + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ matrix.java }}-${{ hashFiles('**/*.gradle*') }} + restore-keys: | + ${{ runner.os }}-gradle-${{ matrix.java }}- + ${{ runner.os }}-gradle- + - run: ./gradlew assemble + - run: ./gradlew check diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8766daf..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: java - -jdk: - - openjdk8 - - openjdk11 - -before_cache: - - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock - - rm -fr $HOME/.gradle/caches/*/plugin-resolution/ -cache: - directories: - - $HOME/.gradle/caches/ - - $HOME/.gradle/wrapper/ diff --git a/README.md b/README.md index 9127bdf..93f5a3a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Build Status](https://api.travis-ci.com/zaproxy/zap-api-java.svg?branch=develop)](https://travis-ci.com/zaproxy/zap-api-java) [![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) The Java implementation to access the [OWASP ZAP API](https://www.zaproxy.org/docs/api/). For more information From 0074cf231bcae0a0a91e8b5ecd22f2a948761bbe Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 19 Apr 2021 18:40:41 +0100 Subject: [PATCH 095/148] Update Gradle to 7.0 Update Gradle Wrapper and build to 7.0. Update Spotless to 5.12.1. Update Error Prone Gradle plugin to 2.0.1. Remove dependency check plugin, not actively used, and there's just one dependency. Add `SNAPSHOT` to version, still dev. Signed-off-by: thc202 --- build.gradle | 23 +++----- gradle/wrapper/gradle-wrapper.jar | Bin 54417 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 53 +++++++++++------- gradlew.bat | 43 +++++++------- .../zap-clientapi-ant.gradle | 2 +- .../zap-clientapi/zap-clientapi.gradle | 7 +-- 7 files changed, 72 insertions(+), 59 deletions(-) diff --git a/build.gradle b/build.gradle index a2cc146..86a0ab9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,26 +1,18 @@ -buildscript { - repositories { - maven { url "https://plugins.gradle.org/m2/" } - } - dependencies { - classpath JavaVersion.current() == JavaVersion.VERSION_1_8 ? "net.ltgt.gradle:gradle-errorprone-plugin:0.0.16" : "net.ltgt.gradle:gradle-errorprone-javacplugin-plugin:0.3" - } -} - plugins { - id "com.diffplug.gradle.spotless" version "3.23.0" apply false + id "com.diffplug.spotless" version "5.12.1" + id "net.ltgt.errorprone" version "2.0.1" } apply from: "gradle/compile.gradle" subprojects { apply plugin: 'java-library' - apply plugin: 'com.diffplug.gradle.spotless' - apply plugin: JavaVersion.current() == JavaVersion.VERSION_1_8 ? "net.ltgt.errorprone" : "net.ltgt.errorprone-javacplugin" + apply plugin: 'com.diffplug.spotless' + apply plugin: "net.ltgt.errorprone" group = 'org.zaproxy' - version '1.10.0' + version '1.10.0-SNAPSHOT' ext.versionBC = '1.9.0' repositories { @@ -34,11 +26,14 @@ subprojects { java { licenseHeaderFile "$rootDir/gradle/spotless/license.java" - googleJavaFormat().style('AOSP') + googleJavaFormat("1.7").style('AOSP') } } dependencies { errorprone 'com.google.errorprone:error_prone_core:2.3.1' + if (JavaVersion.current() == JavaVersion.VERSION_1_8) { + errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") + } } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 758de960ec7947253b058ff79c88ce51f3abe08a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 54417 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1b2b07c..9d17479 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip +distributionSha256Sum=81003f83b0056d20eedf48cddd4f52a9813163d4ba185bcf8abd34b8eeea4cbd +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d..4f906e0 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f955316..107acd3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index 76a16b9..cec1707 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -10,7 +10,7 @@ dependencies { jar { manifest { attributes 'Implementation-Title': 'OWASP ZAP Ant API Client', - 'Implementation-Version': version, + 'Implementation-Version': archiveVersion.get(), 'Create-Date': new Date().format("yyyy-MM-dd") } } diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index b6c0d30..2e78082 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -2,7 +2,6 @@ plugins { id "maven-publish" id "signing" id "me.champeau.gradle.japicmp" version "0.2.9" - id "org.owasp.dependencycheck" version "3.2.1" } sourceSets { examples } @@ -19,7 +18,7 @@ dependencies { jar { manifest { attributes 'Implementation-Title': 'OWASP ZAP API Client', - 'Implementation-Version': version, + 'Implementation-Version': archiveVersion.get(), 'Main-Class': 'org.zaproxy.clientapi.core.ClientApiMain', 'Create-Date': new Date().format("yyyy-MM-dd") } @@ -63,10 +62,10 @@ task sourcesJar(type: Jar) { task uberJar(type: Jar) { group 'build' description 'Assembles a jar archive containing the main jar and its dependencies.' - baseName 'zap-api' + archiveBaseName.set('zap-api') manifest.from jar.manifest from { - configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } { exclude "META-INF/*.SF" exclude "META-INF/*.DSA" From ead972dda82d091def51b8b1cadec699543fa272 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 7 Jun 2021 13:44:08 +0100 Subject: [PATCH 096/148] Update Gradle to 7.0.2 Use latest version. Signed-off-by: thc202 --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9d17479..e1e2fd2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=81003f83b0056d20eedf48cddd4f52a9813163d4ba185bcf8abd34b8eeea4cbd -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip +distributionSha256Sum=13bf8d3cf8eeeb5770d19741a59bde9bd966dd78d17f1bbad787a05ef19d1c2d +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From ce212d4962162a52529127c8fa92abd19030c8b9 Mon Sep 17 00:00:00 2001 From: Joseph Benken Date: Thu, 24 Jun 2021 10:38:35 -0700 Subject: [PATCH 097/148] SimpleExample - wait until the passive scanner completes Replaced the hard coded thread sleep with explicit API calls to poll the number of records the passive scanner still has to scan. Signed-off-by: Joseph Benken --- .../zaproxy/clientapi/examples/SimpleExample.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 9300ace..34cde02 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -67,8 +67,18 @@ public static void main(String[] args) { } System.out.println("Spider complete"); - // Give the passive scanner a chance to complete - Thread.sleep(2000); + // Poll the number of records the passive scanner still has to scan until it completes + while (true) { + Thread.sleep(1000); + progress = + Integer.parseInt( + ((ApiResponseElement) api.pscan.recordsToScan()).getValue()); + System.out.println("Passive Scan progress : " + progress + " records left"); + if (progress < 1) { + break; + } + } + System.out.println("Passive Scan complete"); System.out.println("Active scan : " + TARGET); resp = api.ascan.scan(TARGET, "True", "False", null, null, null); From 6a4307d83ec2be9d814c0e036ae79198caac9dd3 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 11 Oct 2021 13:41:50 +0100 Subject: [PATCH 098/148] Add/update APIs of add-ons and core Update core APIs for 2.11. Add the APIs of the following add-ons: - Automation Framework version 0.7.0; - Report Generation version 0.8.0; - Retest version 0.2.0. Update the APIs of the following add-ons: - Ajax Spider version 23.6.0; - Alert Filters version 13; - GraphQL Support version 0.6.0; - OpenAPI Support version 23; - Replacer version 9. Signed-off-by: thc202 --- CHANGELOG.md | 13 ++ .../org/zaproxy/clientapi/ant/ReportTask.java | 1 + .../clientapi/examples/SimpleExample.java | 1 + .../org/zaproxy/clientapi/core/ClientApi.java | 6 + .../org/zaproxy/clientapi/gen/AjaxSpider.java | 182 +++++++++++++++--- .../zaproxy/clientapi/gen/AlertFilter.java | 54 ++++++ .../java/org/zaproxy/clientapi/gen/Ascan.java | 12 ++ .../org/zaproxy/clientapi/gen/Automation.java | 51 +++++ .../java/org/zaproxy/clientapi/gen/Core.java | 82 +++++--- .../org/zaproxy/clientapi/gen/Graphql.java | 41 ++++ .../org/zaproxy/clientapi/gen/Openapi.java | 24 +-- .../org/zaproxy/clientapi/gen/Replacer.java | 2 +- .../org/zaproxy/clientapi/gen/Reports.java | 116 +++++++++++ .../org/zaproxy/clientapi/gen/Retest.java | 44 +++++ .../gen/deprecated/OpenapiDeprecated.java | 74 +++++++ 15 files changed, 631 insertions(+), 72 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reports.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Retest.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java diff --git a/CHANGELOG.md b/CHANGELOG.md index bf60b9a..fcbeba0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add the APIs of the following add-ons: + - Automation Framework version 0.7.0; + - Report Generation add-on, version 0.8.0; + - Retest version 0.2.0. +### Changed +- Update core APIs for 2.11. +- Update the APIs of the following add-ons: + - Ajax Spider version 23.6.0; + - Alert Filters version 13; + - GraphQL Support version 0.6.0; + - OpenAPI Support version 23; + - Replacer version 9. ## [1.9.0] - 2020-12-18 ### Added diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java index 8fcd198..a4ee965 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java @@ -58,6 +58,7 @@ public void setOverwrite(boolean overwrite) { } @Override + @SuppressWarnings("deprecation") public void execute() throws BuildException { validateTaskAttributes(); diff --git a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java index 34cde02..cb3715a 100644 --- a/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java +++ b/subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples/SimpleExample.java @@ -39,6 +39,7 @@ public class SimpleExample { private static final String TARGET = "http://localhost:8080/bodgeit/"; + @SuppressWarnings("deprecation") public static void main(String[] args) { ClientApi api = new ClientApi(ZAP_ADDRESS, ZAP_PORT, ZAP_API_KEY); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 9fdb1ec..36fbde7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -54,6 +54,7 @@ import org.zaproxy.clientapi.gen.Ascan; import org.zaproxy.clientapi.gen.Authentication; import org.zaproxy.clientapi.gen.Authorization; +import org.zaproxy.clientapi.gen.Automation; import org.zaproxy.clientapi.gen.Autoupdate; import org.zaproxy.clientapi.gen.Break; import org.zaproxy.clientapi.gen.Context; @@ -69,6 +70,8 @@ import org.zaproxy.clientapi.gen.Pnh; import org.zaproxy.clientapi.gen.Pscan; import org.zaproxy.clientapi.gen.Replacer; +import org.zaproxy.clientapi.gen.Reports; +import org.zaproxy.clientapi.gen.Retest; import org.zaproxy.clientapi.gen.Reveal; import org.zaproxy.clientapi.gen.Revisit; import org.zaproxy.clientapi.gen.RuleConfig; @@ -110,6 +113,7 @@ public class ClientApi { public Ascan ascan = new Ascan(this); public Authentication authentication = new Authentication(this); public Authorization authorization = new Authorization(this); + public Automation automation = new Automation(this); public Autoupdate autoupdate = new Autoupdate(this); public Break brk = new Break(this); public Context context = new Context(this); @@ -125,6 +129,8 @@ public class ClientApi { public Pnh pnh = new Pnh(this); public Pscan pscan = new Pscan(this); public Replacer replacer = new Replacer(this); + public Reports reports = new Reports(this); + public Retest retest = new Retest(this); public Reveal reveal = new Reveal(this); public Revisit revisit = new Revisit(this); public RuleConfig ruleConfig = new RuleConfig(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 380bae0..75b5e64 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -36,17 +36,30 @@ public AjaxSpider(ClientApi api) { this.api = api; } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the allowed resources. The allowed resources are always fetched even if out of scope, + * allowing to include necessary resources (e.g. scripts) from 3rd-parties. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse allowedResources() throws ClientApiException { return api.callApi("ajaxSpider", "view", "allowedResources", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the current status of the crawler. Actual values are Stopped and Running. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse status() throws ClientApiException { return api.callApi("ajaxSpider", "view", "status", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the current results of the crawler. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse results(String start, String count) throws ClientApiException { Map map = new HashMap<>(); if (start != null) { @@ -58,62 +71,115 @@ public ApiResponse results(String start, String count) throws ClientApiException return api.callApi("ajaxSpider", "view", "results", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the number of resources found. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse numberOfResults() throws ClientApiException { return api.callApi("ajaxSpider", "view", "numberOfResults", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the full crawled content detected by the AJAX Spider. Returns a set of values based on + * 'inScope' URLs, 'outOfScope' URLs, and 'errors' encountered during the last/current run of + * the AJAX Spider. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse fullResults() throws ClientApiException { return api.callApi("ajaxSpider", "view", "fullResults", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured browser to use for crawling. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionBrowserId() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionBrowserId", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the time to wait after an event (in milliseconds). For example: the wait delay after the + * cursor hovers over an element, in order for a menu to display, etc. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionEventWait() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionEventWait", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured value for the max crawl depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxCrawlDepth() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionMaxCrawlDepth", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured value for the maximum crawl states allowed. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxCrawlStates() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionMaxCrawlStates", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured max duration of the crawl, the value is in minutes. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxDuration() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionMaxDuration", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured number of browsers to be used. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionNumberOfBrowsers() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionNumberOfBrowsers", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured time to wait after reloading the page, this value is in milliseconds. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionReloadWait() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionReloadWait", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the configured value for 'Click Default Elements Only', HTML elements such as 'a', + * 'button', 'input', all associated with some action or links on the page. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionClickDefaultElems() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionClickDefaultElems", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets the value configured for the AJAX Spider to know if it should click on the elements only + * once. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionClickElemsOnce() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionClickElemsOnce", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Gets if the AJAX Spider will use random values in form fields when crawling, if set to true. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionRandomInputs() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionRandomInputs", null); } @@ -161,12 +227,20 @@ public ApiResponse scanAsUser( return api.callApi("ajaxSpider", "action", "scanAsUser", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Stops the AJAX Spider. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse stop() throws ClientApiException { return api.callApi("ajaxSpider", "action", "stop", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Adds an allowed resource. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse addAllowedResource(String regex, String enabled) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); @@ -176,14 +250,22 @@ public ApiResponse addAllowedResource(String regex, String enabled) throws Clien return api.callApi("ajaxSpider", "action", "addAllowedResource", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Removes an allowed resource. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse removeAllowedResource(String regex) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); return api.callApi("ajaxSpider", "action", "removeAllowedResource", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets whether or not an allowed resource is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setEnabledAllowedResource(String regex, String enabled) throws ClientApiException { Map map = new HashMap<>(); @@ -192,70 +274,112 @@ public ApiResponse setEnabledAllowedResource(String regex, String enabled) return api.callApi("ajaxSpider", "action", "setEnabledAllowedResource", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the configuration of the AJAX Spider to use one of the supported browsers. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionBrowserId(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("ajaxSpider", "action", "setOptionBrowserId", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets whether or not the the AJAX Spider will only click on the default HTML elements. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionClickDefaultElems(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionClickDefaultElems", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * When enabled, the crawler attempts to interact with each element (e.g., by clicking) only + * once. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionClickElemsOnce(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the time to wait after an event (in milliseconds). For example: the wait delay after the + * cursor hovers over an element, in order for a menu to display, etc. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionEventWait(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionEventWait", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the maximum depth that the crawler can reach. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionMaxCrawlDepth(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlDepth", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the maximum number of states that the crawler should crawl. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionMaxCrawlStates(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxCrawlStates", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * The maximum time that the crawler is allowed to run. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionMaxDuration", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the number of windows to be used by AJAX Spider. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionNumberOfBrowsers(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("ajaxSpider", "action", "setOptionNumberOfBrowsers", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * When enabled, inserts random values into form fields. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionRandomInputs(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("ajaxSpider", "action", "setOptionRandomInputs", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Sets the time to wait after the page is loaded before interacting with it. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionReloadWait(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 7174261..14953a9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -319,4 +319,58 @@ public ApiResponse removeGlobalAlertFilter( } return api.callApi("alertFilter", "action", "removeGlobalAlertFilter", map); } + + /** + * Applies all currently enabled Global and Context alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse applyAll() throws ClientApiException { + return api.callApi("alertFilter", "action", "applyAll", null); + } + + /** + * Applies all currently enabled Context alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse applyContext() throws ClientApiException { + return api.callApi("alertFilter", "action", "applyContext", null); + } + + /** + * Applies all currently enabled Global alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse applyGlobal() throws ClientApiException { + return api.callApi("alertFilter", "action", "applyGlobal", null); + } + + /** + * Tests all currently enabled Global and Context alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse testAll() throws ClientApiException { + return api.callApi("alertFilter", "action", "testAll", null); + } + + /** + * Tests all currently enabled Context alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse testContext() throws ClientApiException { + return api.callApi("alertFilter", "action", "testContext", null); + } + + /** + * Tests all currently enabled Global alert filters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse testGlobal() throws ClientApiException { + return api.callApi("alertFilter", "action", "testGlobal", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index cbd9ea1..fb85504 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -232,6 +232,11 @@ public ApiResponse optionScanHeadersAllRequests() throws ClientApiException { return api.callApi("ascan", "view", "optionScanHeadersAllRequests", null); } + /** Tells whether or not the active scanner should scan null JSON values. */ + public ApiResponse optionScanNullJsonValues() throws ClientApiException { + return api.callApi("ascan", "view", "optionScanNullJsonValues", null); + } + public ApiResponse optionShowAdvancedDialog() throws ClientApiException { return api.callApi("ascan", "view", "optionShowAdvancedDialog", null); } @@ -699,6 +704,13 @@ public ApiResponse setOptionScanHeadersAllRequests(boolean bool) throws ClientAp return api.callApi("ascan", "action", "setOptionScanHeadersAllRequests", map); } + /** Sets whether or not the active scanner should scan null JSON values. */ + public ApiResponse setOptionScanNullJsonValues(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionScanNullJsonValues", map); + } + public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java new file mode 100644 index 0000000..cd76a9b --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java @@ -0,0 +1,51 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2021 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Automation { + + private final ClientApi api; + + public Automation(ClientApi api) { + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse planProgress(String planid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("planId", planid); + return api.callApi("automation", "view", "planProgress", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse runPlan(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("automation", "action", "runPlan", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 6408c69..92c3d10 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -124,10 +124,6 @@ public ApiResponse excludedFromProxy() throws ClientApiException { return api.callApi("core", "view", "excludedFromProxy", null); } - public ApiResponse homeDirectory() throws ClientApiException { - return api.callApi("core", "view", "homeDirectory", null); - } - /** Gets the location of the current session file */ public ApiResponse sessionLocation() throws ClientApiException { return api.callApi("core", "view", "sessionLocation", null); @@ -141,6 +137,32 @@ public ApiResponse proxyChainExcludedDomains() throws ClientApiException { return api.callApi("core", "view", "proxyChainExcludedDomains", null); } + /** Gets the path to ZAP's home directory. */ + public ApiResponse zapHomePath() throws ClientApiException { + return api.callApi("core", "view", "zapHomePath", null); + } + + /** Gets the maximum number of alert instances to include in a report. */ + public ApiResponse optionMaximumAlertInstances() throws ClientApiException { + return api.callApi("core", "view", "optionMaximumAlertInstances", null); + } + + /** Gets whether or not related alerts will be merged in any reports generated. */ + public ApiResponse optionMergeRelatedAlerts() throws ClientApiException { + return api.callApi("core", "view", "optionMergeRelatedAlerts", null); + } + + /** Gets the path to the file with alert overrides. */ + public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { + return api.callApi("core", "view", "optionAlertOverridesFilePath", null); + } + + /** @deprecated */ + @Deprecated + public ApiResponse homeDirectory() throws ClientApiException { + return api.callApi("core", "view", "homeDirectory", null); + } + /** * Use view proxyChainExcludedDomains instead. * @@ -171,26 +193,6 @@ public ApiResponse optionProxyExcludedDomainsEnabled() throws ClientApiException return api.callApi("core", "view", "optionProxyExcludedDomainsEnabled", null); } - /** Gets the path to ZAP's home directory. */ - public ApiResponse zapHomePath() throws ClientApiException { - return api.callApi("core", "view", "zapHomePath", null); - } - - /** Gets the maximum number of alert instances to include in a report. */ - public ApiResponse optionMaximumAlertInstances() throws ClientApiException { - return api.callApi("core", "view", "optionMaximumAlertInstances", null); - } - - /** Gets whether or not related alerts will be merged in any reports generated. */ - public ApiResponse optionMergeRelatedAlerts() throws ClientApiException { - return api.callApi("core", "view", "optionMergeRelatedAlerts", null); - } - - /** Gets the path to the file with alert overrides. */ - public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { - return api.callApi("core", "view", "optionAlertOverridesFilePath", null); - } - /** * Gets the alert with the given ID, the corresponding HTTP message can be obtained with the * 'messageId' field and 'message' API method @@ -297,7 +299,7 @@ public ApiResponse optionProxyChainUserName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainUserName", null); } - /** Gets the connection time out, in seconds. */ + /** Gets the connection time out (in seconds). */ public ApiResponse optionTimeoutInSecs() throws ClientApiException { return api.callApi("core", "view", "optionTimeoutInSecs", null); } @@ -670,7 +672,7 @@ public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws Clien return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); } - /** Sets the connection time out, in seconds. */ + /** Sets the connection time out (in seconds). */ public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); @@ -715,22 +717,42 @@ public byte[] setproxy(String proxy) throws ClientApiException { return api.callApiOther("core", "other", "setproxy", map); } - /** Generates a report in XML format */ + /** + * Generates a report in XML format + * + * @deprecated Use the 'generate' API endpoint the 'reports' component instead. + */ + @Deprecated public byte[] xmlreport() throws ClientApiException { return api.callApiOther("core", "other", "xmlreport", null); } - /** Generates a report in HTML format */ + /** + * Generates a report in HTML format + * + * @deprecated Use the 'generate' API endpoint the 'reports' component instead. + */ + @Deprecated public byte[] htmlreport() throws ClientApiException { return api.callApiOther("core", "other", "htmlreport", null); } - /** Generates a report in JSON format */ + /** + * Generates a report in JSON format + * + * @deprecated Use the 'generate' API endpoint the 'reports' component instead. + */ + @Deprecated public byte[] jsonreport() throws ClientApiException { return api.callApiOther("core", "other", "jsonreport", null); } - /** Generates a report in Markdown format */ + /** + * Generates a report in Markdown format + * + * @deprecated Use the 'generate' API endpoint the 'reports' component instead. + */ + @Deprecated public byte[] mdreport() throws ClientApiException { return api.callApiOther("core", "other", "mdreport", null); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java index 43be0e7..35261ab 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java @@ -44,6 +44,24 @@ public ApiResponse optionArgsType() throws ClientApiException { return api.callApi("graphql", "view", "optionArgsType", null); } + /** + * Returns whether or not lenient maximum query generation depth is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionLenientMaxQueryDepthEnabled() throws ClientApiException { + return api.callApi("graphql", "view", "optionLenientMaxQueryDepthEnabled", null); + } + + /** + * Returns the current maximum additional query generation depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionMaxAdditionalQueryDepth() throws ClientApiException { + return api.callApi("graphql", "view", "optionMaxAdditionalQueryDepth", null); + } + /** * Returns the current maximum arguments generation depth. * @@ -148,6 +166,29 @@ public ApiResponse setOptionRequestMethod(String string) throws ClientApiExcepti return api.callApi("graphql", "action", "setOptionRequestMethod", map); } + /** + * Sets whether or not Maximum Query Depth is enforced leniently. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionLenientMaxQueryDepthEnabled(boolean bool) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("graphql", "action", "setOptionLenientMaxQueryDepthEnabled", map); + } + + /** + * Sets the maximum additional query generation depth (used if enforced leniently). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionMaxAdditionalQueryDepth(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("graphql", "action", "setOptionMaxAdditionalQueryDepth", map); + } + /** * Sets the maximum arguments generation depth. * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index e72a191..284a143 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -27,34 +27,30 @@ /** This file was automatically generated. */ @SuppressWarnings("javadoc") -public class Openapi { +public class Openapi extends org.zaproxy.clientapi.gen.deprecated.OpenapiDeprecated { private final ClientApi api; public Openapi(ClientApi api) { + super(api); this.api = api; } - /** - * Imports an Open API definition from a local file. - * - *

This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse importFile(String file) throws ClientApiException { - return importFile(file, null); - } - /** * Imports an OpenAPI definition from a local file. * *

This component is optional and therefore the API will only work if it is installed */ - public ApiResponse importFile(String file, String target) throws ClientApiException { + public ApiResponse importFile(String file, String target, String contextid) + throws ClientApiException { Map map = new HashMap<>(); map.put("file", file); if (target != null) { map.put("target", target); } + if (contextid != null) { + map.put("contextId", contextid); + } return api.callApi("openapi", "action", "importFile", map); } @@ -63,12 +59,16 @@ public ApiResponse importFile(String file, String target) throws ClientApiExcept * *

This component is optional and therefore the API will only work if it is installed */ - public ApiResponse importUrl(String url, String hostoverride) throws ClientApiException { + public ApiResponse importUrl(String url, String hostoverride, String contextid) + throws ClientApiException { Map map = new HashMap<>(); map.put("url", url); if (hostoverride != null) { map.put("hostOverride", hostoverride); } + if (contextid != null) { + map.put("contextId", contextid); + } return api.callApi("openapi", "action", "importUrl", map); } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 43089f0..45ba39d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -51,7 +51,7 @@ public ApiResponse rules() throws ClientApiException { * treated as a regex otherwise false, matchString is the string that will be matched against, * replacement is the replacement string, initiators may be blank (for all initiators) or a * comma separated list of integers as defined in HttpSender + * href="https://github.com/zaproxy/zaproxy/blob/main/zap/src/main/java/org/parosproxy/paros/network/HttpSender.java">HttpSender * *

This component is optional and therefore the API will only work if it is installed */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reports.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reports.java new file mode 100644 index 0000000..5ec8516 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Reports.java @@ -0,0 +1,116 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2021 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Reports { + + private final ClientApi api; + + public Reports(ClientApi api) { + this.api = api; + } + + /** + * View available templates. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse templates() throws ClientApiException { + return api.callApi("reports", "view", "templates", null); + } + + /** + * View details of the specified template. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse templateDetails(String template) throws ClientApiException { + Map map = new HashMap<>(); + map.put("template", template); + return api.callApi("reports", "view", "templateDetails", map); + } + + /** + * Generate a report with the supplied parameters. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse generate( + String title, + String template, + String theme, + String description, + String contexts, + String sites, + String sections, + String includedconfidences, + String includedrisks, + String reportfilename, + String reportfilenamepattern, + String reportdir, + String display) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("title", title); + map.put("template", template); + if (theme != null) { + map.put("theme", theme); + } + if (description != null) { + map.put("description", description); + } + if (contexts != null) { + map.put("contexts", contexts); + } + if (sites != null) { + map.put("sites", sites); + } + if (sections != null) { + map.put("sections", sections); + } + if (includedconfidences != null) { + map.put("includedConfidences", includedconfidences); + } + if (includedrisks != null) { + map.put("includedRisks", includedrisks); + } + if (reportfilename != null) { + map.put("reportFileName", reportfilename); + } + if (reportfilenamepattern != null) { + map.put("reportFileNamePattern", reportfilenamepattern); + } + if (reportdir != null) { + map.put("reportDir", reportdir); + } + if (display != null) { + map.put("display", display); + } + return api.callApi("reports", "action", "generate", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Retest.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Retest.java new file mode 100644 index 0000000..c1a566c --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Retest.java @@ -0,0 +1,44 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2021 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Retest { + + private final ClientApi api; + + public Retest(ClientApi api) { + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse retest(String alertids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("alertIds", alertids); + return api.callApi("retest", "action", "retest", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java new file mode 100644 index 0000000..02c77b0 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java @@ -0,0 +1,74 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2021 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** API implementation with deprecated methods, (re)moved from generated class. */ +@SuppressWarnings("javadoc") +public class OpenapiDeprecated { + + private final ClientApi api; + + public OpenapiDeprecated(ClientApi api) { + this.api = api; + } + + /** + * Imports an Open API definition from a local file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file) throws ClientApiException { + return importFile(file, null); + } + + /** + * Imports an OpenAPI definition from a local file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file, String target) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + if (target != null) { + map.put("target", target); + } + return api.callApi("openapi", "action", "importFile", map); + } + + /** + * Imports an OpenAPI definition from a URL. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url, String hostoverride) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + if (hostoverride != null) { + map.put("hostOverride", hostoverride); + } + return api.callApi("openapi", "action", "importUrl", map); + } +} From 5a49a30332896b6d64196ae2da985694b57f2086 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 11 Oct 2021 14:21:27 +0100 Subject: [PATCH 099/148] Tidy up code Remove unnecessary type arguments and semicolons. Signed-off-by: thc202 --- .../src/main/java/org/zaproxy/clientapi/core/Alert.java | 6 +++--- .../java/org/zaproxy/clientapi/core/ApiResponseList.java | 6 +++--- .../src/main/java/org/zaproxy/clientapi/core/ClientApi.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index 228a3c6..3aa7250 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -26,7 +26,7 @@ public enum Risk { Low, Medium, High - }; + } /** * @deprecated (2.4.0) Replaced by {@link Confidence}. Use of reliability has been deprecated in * favour of using confidence. @@ -35,7 +35,7 @@ public enum Risk { public enum Reliability { Suspicious, Warning - }; + } public enum Confidence { FalsePositive, @@ -43,7 +43,7 @@ public enum Confidence { Medium, High, Confirmed - }; + } private String id; private String name; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java index 47f6185..b498a73 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java @@ -30,7 +30,7 @@ public class ApiResponseList extends ApiResponse { public ApiResponseList(String name) { super(name); - this.list = new ArrayList(); + this.list = new ArrayList<>(); } public ApiResponseList(Node node) throws ClientApiException { @@ -45,7 +45,7 @@ public ApiResponseList(Node node) throws ClientApiException { public ApiResponseList(Node node, ApiResponseList template) throws ClientApiException { super(node.getNodeName()); try { - this.list = new ArrayList(); + this.list = new ArrayList<>(); Class clazz = template.getItemsClass(); if (clazz != null) { @@ -64,7 +64,7 @@ public ApiResponseList(Node node, ApiResponseList template) throws ClientApiExce public ApiResponseList(String name, ApiResponse[] array) { super(name); - this.list = new ArrayList(); + this.list = new ArrayList<>(); for (ApiResponse resp : array) { list.add(resp); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 36fbde7..11ee4e8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -264,7 +264,7 @@ public void checkAlerts(List ignoreAlerts, List requireAlerts, Fil } public List getAlerts(String baseUrl, int start, int count) throws ClientApiException { - List alerts = new ArrayList(); + List alerts = new ArrayList<>(); ApiResponse response = alert.alerts(baseUrl, String.valueOf(start), String.valueOf(count), null); if (response != null && response instanceof ApiResponseList) { From b3c90ca9e9e92c6557314f86b3115982ac469977 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 11 Oct 2021 15:54:42 +0100 Subject: [PATCH 100/148] Release 1.10.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcbeba0..26f9c03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.10.0] - 2021-10-11 ### Added - Add the APIs of the following add-ons: - Automation Framework version 0.7.0; @@ -139,7 +139,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...HEAD +[1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/zaproxy/zap-api-java/compare/v1.6.0...v1.7.0 diff --git a/README.md b/README.md index 93f5a3a..471b9db 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.9.0` + * Version: `1.10.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle b/build.gradle index 86a0ab9..cc415a4 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ subprojects { group = 'org.zaproxy' - version '1.10.0-SNAPSHOT' + version '1.10.0' ext.versionBC = '1.9.0' repositories { From 9f0ee438ac94d41586a89938af075a5d719acc38 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 11 Oct 2021 16:48:09 +0100 Subject: [PATCH 101/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++++ build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26f9c03..668cd58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + + ## [1.10.0] - 2021-10-11 ### Added - Add the APIs of the following add-ons: @@ -139,6 +142,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...HEAD [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 diff --git a/build.gradle b/build.gradle index cc415a4..7961855 100644 --- a/build.gradle +++ b/build.gradle @@ -12,8 +12,8 @@ subprojects { group = 'org.zaproxy' - version '1.10.0' - ext.versionBC = '1.9.0' + version '1.11.0-SNAPSHOT' + ext.versionBC = '1.10.0' repositories { mavenCentral() From 8607944447105e73374c085b851399926c020ccf Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 18 Mar 2022 20:15:24 +0000 Subject: [PATCH 102/148] Update Gradle to 7.4.1 Update Gradle Wrapper to 7.4.1. Signed-off-by: thc202 --- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 257 ++++++++++++++--------- 3 files changed, 155 insertions(+), 106 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 20926 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 i_W%EDg1>@4`_NK(#)z|gdCiK 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e1e2fd2..db3bccc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=13bf8d3cf8eeeb5770d19741a59bde9bd966dd78d17f1bbad787a05ef19d1c2d -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +distributionSha256Sum=a9a7b7baba105f6557c9dcf9c3c6e8f7e57e6b49889c5f1d133f015d0727e4be +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" From 6d59136694ed94cfa9b7b423b55853c71e8dce92 Mon Sep 17 00:00:00 2001 From: Akshath Kothari Date: Tue, 3 May 2022 19:14:25 +0530 Subject: [PATCH 103/148] Update add-on APIs Changed - Update the APIs of the following add-ons: - Automation Framework version 0.15.0; - Selenium version 15.8.0; Fixed - Add a graphql object to ClientApi. Signed-off-by: Akshath Kothari --- CHANGELOG.md | 6 +++ .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/Automation.java | 5 +++ .../org/zaproxy/clientapi/gen/Selenium.java | 37 +++++++++++++++++++ 4 files changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 668cd58..d31fc55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Update the APIs of the following add-ons: + - Automation Framework version 0.15.0; + - Selenium version 15.8.0; +### Fixed +- Add a graphql object to ClientApi. ## [1.10.0] - 2021-10-11 ### Added diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 11ee4e8..d987fd6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -61,6 +61,7 @@ import org.zaproxy.clientapi.gen.Core; import org.zaproxy.clientapi.gen.Exportreport; import org.zaproxy.clientapi.gen.ForcedUser; +import org.zaproxy.clientapi.gen.Graphql; import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.ImportLogFiles; import org.zaproxy.clientapi.gen.Importurls; @@ -120,6 +121,7 @@ public class ClientApi { public Core core = new Core(this); public Exportreport exportreport = new Exportreport(this); public ForcedUser forcedUser = new ForcedUser(this); + public Graphql graphql = new Graphql(this); public HttpSessions httpSessions = new HttpSessions(this); public ImportLogFiles logImportFiles = new ImportLogFiles(this); public Importurls importurls = new Importurls(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java index cd76a9b..36efd80 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java @@ -48,4 +48,9 @@ public ApiResponse runPlan(String filepath) throws ClientApiException { map.put("filePath", filepath); return api.callApi("automation", "action", "runPlan", map); } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse endDelayJob() throws ClientApiException { + return api.callApi("automation", "action", "endDelayJob", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 3393c4e..de418fa 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -36,6 +36,20 @@ public Selenium(ClientApi api) { this.api = api; } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionBrowserExtensions() throws ClientApiException { + return api.callApi("selenium", "view", "optionBrowserExtensions", null); + } + + /** + * Returns the current path to Chrome binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionChromeBinaryPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionChromeBinaryPath", null); + } + /** * Returns the current path to ChromeDriver * @@ -69,6 +83,11 @@ public ApiResponse optionIeDriverPath() throws ClientApiException { return api.callApi("selenium", "view", "optionIeDriverPath", null); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionLastDirectory() throws ClientApiException { + return api.callApi("selenium", "view", "optionLastDirectory", null); + } + /** * Returns the current path to PhantomJS binary * @@ -78,6 +97,17 @@ public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { return api.callApi("selenium", "view", "optionPhantomJsBinaryPath", null); } + /** + * Sets the current path to Chrome binary + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionChromeBinaryPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionChromeBinaryPath", map); + } + /** * Sets the current path to ChromeDriver * @@ -119,6 +149,13 @@ public ApiResponse setOptionIeDriverPath(String string) throws ClientApiExceptio return api.callApi("selenium", "action", "setOptionIeDriverPath", map); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionLastDirectory(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionLastDirectory", map); + } + /** * Sets the current path to PhantomJS binary * From 921569fb47d319bb407e9670ca1ae2c79d1d9cae Mon Sep 17 00:00:00 2001 From: thc202 Date: Sat, 29 Oct 2022 15:39:22 +0100 Subject: [PATCH 104/148] Add/update APIs of add-ons and core Update core APIs for 2.12.0. Add the APIs of the following add-ons: - Import/Export version 0.3.0; - Network version 0.3.0; - Spider version 0.1.0. Update the API of the following add-on: - Replacer version 11. Deprecate the following APIs: - `ImportLogFiles`; - `Importurls`; - `LocalProxies`. Update Gradle Plugin for japicmp. Signed-off-by: thc202 --- CHANGELOG.md | 14 + .../org/zaproxy/clientapi/core/ClientApi.java | 23 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 24 +- .../java/org/zaproxy/clientapi/gen/Core.java | 237 ++++++-- .../java/org/zaproxy/clientapi/gen/Exim.java | 129 ++++ .../zaproxy/clientapi/gen/ImportLogFiles.java | 7 +- .../org/zaproxy/clientapi/gen/Importurls.java | 7 +- .../zaproxy/clientapi/gen/LocalProxies.java | 7 +- .../org/zaproxy/clientapi/gen/Network.java | 565 ++++++++++++++++++ .../java/org/zaproxy/clientapi/gen/Pscan.java | 27 +- .../org/zaproxy/clientapi/gen/Replacer.java | 10 +- .../org/zaproxy/clientapi/gen/Spider.java | 178 ++++-- .../gen/deprecated/AcsrfDeprecated.java | 10 + .../gen/deprecated/AscanDeprecated.java | 5 + .../gen/deprecated/ReplacerDeprecated.java | 63 ++ .../gen/deprecated/SpiderDeprecated.java | 24 + .../zap-clientapi/zap-clientapi.gradle | 16 +- 17 files changed, 1219 insertions(+), 127 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java diff --git a/CHANGELOG.md b/CHANGELOG.md index d31fc55..2b55ef7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add the APIs of the following add-ons: + - Import/Export version 0.3.0; + - Network version 0.3.0; + - Spider version 0.1.0. + ### Changed +- Update core APIs for 2.12. - Update the APIs of the following add-ons: - Automation Framework version 0.15.0; - Selenium version 15.8.0; + - Replacer version 11. + +### Deprecated +- The following APIs were deprecated: + - `ImportLogFiles`; + - `Importurls`; + - `LocalProxies`. ### Fixed - Add a graphql object to ClientApi. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index d987fd6..7c7875d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -59,13 +59,12 @@ import org.zaproxy.clientapi.gen.Break; import org.zaproxy.clientapi.gen.Context; import org.zaproxy.clientapi.gen.Core; +import org.zaproxy.clientapi.gen.Exim; import org.zaproxy.clientapi.gen.Exportreport; import org.zaproxy.clientapi.gen.ForcedUser; import org.zaproxy.clientapi.gen.Graphql; import org.zaproxy.clientapi.gen.HttpSessions; -import org.zaproxy.clientapi.gen.ImportLogFiles; -import org.zaproxy.clientapi.gen.Importurls; -import org.zaproxy.clientapi.gen.LocalProxies; +import org.zaproxy.clientapi.gen.Network; import org.zaproxy.clientapi.gen.Openapi; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; @@ -119,13 +118,25 @@ public class ClientApi { public Break brk = new Break(this); public Context context = new Context(this); public Core core = new Core(this); + public Exim exim = new Exim(this); public Exportreport exportreport = new Exportreport(this); public ForcedUser forcedUser = new ForcedUser(this); public Graphql graphql = new Graphql(this); public HttpSessions httpSessions = new HttpSessions(this); - public ImportLogFiles logImportFiles = new ImportLogFiles(this); - public Importurls importurls = new Importurls(this); - public LocalProxies localProxies = new LocalProxies(this); + + @SuppressWarnings("deprecation") + public org.zaproxy.clientapi.gen.ImportLogFiles logImportFiles = + new org.zaproxy.clientapi.gen.ImportLogFiles(this); + + @SuppressWarnings("deprecation") + public org.zaproxy.clientapi.gen.Importurls importurls = + new org.zaproxy.clientapi.gen.Importurls(this); + + @SuppressWarnings("deprecation") + public org.zaproxy.clientapi.gen.LocalProxies localProxies = + new org.zaproxy.clientapi.gen.LocalProxies(this); + + public Network network = new Network(this); public Openapi openapi = new Openapi(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index fb85504..ab0a189 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -85,9 +85,7 @@ public ApiResponse excludedFromScan() throws ClientApiException { return api.callApi("ascan", "view", "excludedFromScan", null); } - /** - * Gets the scanners, optionally, of the given scan policy and/or scanner policy/category ID. - */ + /** Gets the scan rules, optionally, of the given scan policy or scanner policy/category ID. */ public ApiResponse scanners(String scanpolicyname, String policyid) throws ClientApiException { Map map = new HashMap<>(); if (scanpolicyname != null) { @@ -253,9 +251,9 @@ public ApiResponse scan( } /** - * Runs the active scanner against the given URL and/or Context. Optionally, the 'recurse' - * parameter can be used to scan URLs under the given URL, the parameter 'inScopeOnly' can be - * used to constrain the scan to URLs that are in scope (ignored if a Context is specified), the + * Runs the active scanner against the given URL or Context. Optionally, the 'recurse' parameter + * can be used to scan URLs under the given URL, the parameter 'inScopeOnly' can be used to + * constrain the scan to URLs that are in scope (ignored if a Context is specified), the * parameter 'scanPolicyName' allows to specify the scan policy (if none is given it uses the * default scan policy), the parameters 'method' and 'postData' allow to select a given request * in conjunction with the given URL. @@ -385,7 +383,7 @@ public ApiResponse excludeFromScan(String regex) throws ClientApiException { } /** - * Enables all scanners of the scan policy with the given name, or the default if none given. + * Enables all scan rules of the scan policy with the given name, or the default if none given. */ public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); @@ -396,7 +394,7 @@ public ApiResponse enableAllScanners(String scanpolicyname) throws ClientApiExce } /** - * Disables all scanners of the scan policy with the given name, or the default if none given. + * Disables all scan rules of the scan policy with the given name, or the default if none given. */ public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); @@ -407,8 +405,8 @@ public ApiResponse disableAllScanners(String scanpolicyname) throws ClientApiExc } /** - * Enables the scanners with the given IDs (comma separated list of IDs) of the scan policy with - * the given name, or the default if none given. + * Enables the scan rules with the given IDs (comma separated list of IDs) of the scan policy + * with the given name, or the default if none given. */ public ApiResponse enableScanners(String ids, String scanpolicyname) throws ClientApiException { Map map = new HashMap<>(); @@ -420,7 +418,7 @@ public ApiResponse enableScanners(String ids, String scanpolicyname) throws Clie } /** - * Disables the scanners with the given IDs (comma separated list of IDs) of the scan policy + * Disables the scan rules with the given IDs (comma separated list of IDs) of the scan policy * with the given name, or the default if none given. */ public ApiResponse disableScanners(String ids, String scanpolicyname) @@ -487,10 +485,6 @@ public ApiResponse setScannerAlertThreshold( return api.callApi("ascan", "action", "setScannerAlertThreshold", map); } - public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { - return addScanPolicy(scanpolicyname, null, null); - } - public ApiResponse addScanPolicy( String scanpolicyname, String alertthreshold, String attackstrength) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 92c3d10..9a466f2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -132,7 +132,10 @@ public ApiResponse sessionLocation() throws ClientApiException { /** * Gets all the domains that are excluded from the outgoing proxy. For each domain the following * are shown: the index, the value (domain), if enabled, and if specified as a regex. + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse proxyChainExcludedDomains() throws ClientApiException { return api.callApi("core", "view", "proxyChainExcludedDomains", null); } @@ -265,66 +268,106 @@ public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientAp /** * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionDefaultUserAgent() throws ClientApiException { return api.callApi("core", "view", "optionDefaultUserAgent", null); } - /** Gets the TTL (in seconds) of successful DNS queries. */ + /** + * Gets the TTL (in seconds) of successful DNS queries. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse optionDnsTtlSuccessfulQueries() throws ClientApiException { return api.callApi("core", "view", "optionDnsTtlSuccessfulQueries", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionHttpState() throws ClientApiException { return api.callApi("core", "view", "optionHttpState", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated + public ApiResponse optionHttpStateEnabled() throws ClientApiException { + return api.callApi("core", "view", "optionHttpStateEnabled", null); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionProxyChainName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainName", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionProxyChainPassword() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainPassword", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionProxyChainPort() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainPort", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated + public ApiResponse optionProxyChainPrompt() throws ClientApiException { + return api.callApi("core", "view", "optionProxyChainPrompt", null); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionProxyChainRealm() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainRealm", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionProxyChainUserName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainUserName", null); } - /** Gets the connection time out (in seconds). */ - public ApiResponse optionTimeoutInSecs() throws ClientApiException { - return api.callApi("core", "view", "optionTimeoutInSecs", null); - } - - public ApiResponse optionHttpStateEnabled() throws ClientApiException { - return api.callApi("core", "view", "optionHttpStateEnabled", null); - } - - public ApiResponse optionProxyChainPrompt() throws ClientApiException { - return api.callApi("core", "view", "optionProxyChainPrompt", null); - } - + /** @deprecated Option no longer in effective use. */ + @Deprecated public ApiResponse optionSingleCookieRequestHeader() throws ClientApiException { return api.callApi("core", "view", "optionSingleCookieRequestHeader", null); } + /** + * Gets the connection time out (in seconds). + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated + public ApiResponse optionTimeoutInSecs() throws ClientApiException { + return api.callApi("core", "view", "optionTimeoutInSecs", null); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionUseProxyChain() throws ClientApiException { return api.callApi("core", "view", "optionUseProxyChain", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse optionUseProxyChainAuth() throws ClientApiException { return api.callApi("core", "view", "optionUseProxyChainAuth", null); } - /** Gets whether or not the SOCKS proxy should be used. */ + /** + * Gets whether or not the SOCKS proxy should be used. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse optionUseSocksProxy() throws ClientApiException { return api.callApi("core", "view", "optionUseSocksProxy", null); } @@ -425,7 +468,12 @@ public ApiResponse setMode(String mode) throws ClientApiException { return api.callApi("core", "action", "setMode", map); } - /** Generates a new Root CA certificate for the local proxies. */ + /** + * Generates a new Root CA certificate for the local proxies. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse generateRootCA() throws ClientApiException { return api.callApi("core", "action", "generateRootCA", null); } @@ -471,7 +519,10 @@ public ApiResponse deleteSiteNode(String url, String method, String postdata) * Adds a domain to be excluded from the outgoing proxy, using the specified value. Optionally * sets if the new entry is enabled (default, true) and whether or not the new value is * specified as a regex (default, false). + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse addProxyChainExcludedDomain(String value, String isregex, String isenabled) throws ClientApiException { Map map = new HashMap<>(); @@ -489,7 +540,10 @@ public ApiResponse addProxyChainExcludedDomain(String value, String isregex, Str * Modifies a domain excluded from the outgoing proxy. Allows to modify the value, if enabled or * if a regex. The domain is selected with its index, which can be obtained with the view * proxyChainExcludedDomains. + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse modifyProxyChainExcludedDomain( String idx, String value, String isregex, String isenabled) throws ClientApiException { Map map = new HashMap<>(); @@ -509,19 +563,32 @@ public ApiResponse modifyProxyChainExcludedDomain( /** * Removes a domain excluded from the outgoing proxy, with the given index. The index can be * obtained with the view proxyChainExcludedDomains. + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse removeProxyChainExcludedDomain(String idx) throws ClientApiException { Map map = new HashMap<>(); map.put("idx", idx); return api.callApi("core", "action", "removeProxyChainExcludedDomain", map); } - /** Enables all domains excluded from the outgoing proxy. */ + /** + * Enables all domains excluded from the outgoing proxy. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse enableAllProxyChainExcludedDomains() throws ClientApiException { return api.callApi("core", "action", "enableAllProxyChainExcludedDomains", null); } - /** Disables all domains excluded from the outgoing proxy. */ + /** + * Disables all domains excluded from the outgoing proxy. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse disableAllProxyChainExcludedDomains() throws ClientApiException { return api.callApi("core", "action", "disableAllProxyChainExcludedDomains", null); } @@ -556,7 +623,10 @@ public ApiResponse setOptionAlertOverridesFilePath(String filepath) throws Clien /** * Enables use of a PKCS12 client certificate for the certificate with the given file system * path, password, and optional index. + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse enablePKCS12ClientCertificate(String filepath, String password, String index) throws ClientApiException { Map map = new HashMap<>(); @@ -568,7 +638,12 @@ public ApiResponse enablePKCS12ClientCertificate(String filepath, String passwor return api.callApi("core", "action", "enablePKCS12ClientCertificate", map); } - /** Disables the option for use of client certificates. */ + /** + * Disables the option for use of client certificates. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse disableClientCertificate() throws ClientApiException { return api.callApi("core", "action", "disableClientCertificate", null); } @@ -598,25 +673,70 @@ public ApiResponse deleteAlert(String id) throws ClientApiException { /** * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionDefaultUserAgent(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionDefaultUserAgent", map); } + /** + * Sets the TTL (in seconds) of successful DNS queries (applies after ZAP restart). + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated + public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated + public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionHttpStateEnabled", map); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionProxyChainName(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainName", map); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainPassword", map); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated + public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("core", "action", "setOptionProxyChainPort", map); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated + public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("core", "action", "setOptionProxyChainPrompt", map); + } + + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); @@ -635,44 +755,28 @@ public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiEx return api.callApi("core", "action", "setOptionProxyChainSkipName", map); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("core", "action", "setOptionProxyChainUserName", map); } - /** Sets the TTL (in seconds) of successful DNS queries (applies after ZAP restart). */ - public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); - } - - public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionHttpStateEnabled", map); - } - - public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Integer", Integer.toString(i)); - return api.callApi("core", "action", "setOptionProxyChainPort", map); - } - - public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { - Map map = new HashMap<>(); - map.put("Boolean", Boolean.toString(bool)); - return api.callApi("core", "action", "setOptionProxyChainPrompt", map); - } - + /** @deprecated Option no longer in effective use. */ + @Deprecated public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionSingleCookieRequestHeader", map); } - /** Sets the connection time out (in seconds). */ + /** + * Sets the connection time out (in seconds). + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); @@ -682,35 +786,54 @@ public ApiResponse setOptionTimeoutInSecs(int i) throws ClientApiException { /** * Sets whether or not the outgoing proxy should be used. The address/hostname of the outgoing * proxy must be set to enable this option. + * + * @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionUseProxyChain", map); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionUseProxyChainAuth", map); } - /** Sets whether or not the SOCKS proxy should be used. */ + /** + * Sets whether or not the SOCKS proxy should be used. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public ApiResponse setOptionUseSocksProxy(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("core", "action", "setOptionUseSocksProxy", map); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public byte[] proxypac() throws ClientApiException { return api.callApiOther("core", "other", "proxy.pac", null); } - /** Gets the Root CA certificate used by the local proxies. */ + /** + * Gets the Root CA certificate used by the local proxies. + * + * @deprecated Use the API endpoints in the 'network' component instead. + */ + @Deprecated public byte[] rootcert() throws ClientApiException { return api.callApiOther("core", "other", "rootcert", null); } + /** @deprecated Use the API endpoints in the 'network' component instead. */ + @Deprecated public byte[] setproxy(String proxy) throws ClientApiException { Map map = new HashMap<>(); map.put("proxy", proxy); @@ -757,7 +880,12 @@ public byte[] mdreport() throws ClientApiException { return api.callApiOther("core", "other", "mdreport", null); } - /** Gets the message with the given ID in HAR format */ + /** + * Gets the message with the given ID in HAR format + * + * @deprecated Use the API endpoints in the 'exim' add-on instead. + */ + @Deprecated public byte[] messageHar(String id) throws ClientApiException { Map map = new HashMap<>(); map.put("id", id); @@ -767,7 +895,10 @@ public byte[] messageHar(String id) throws ClientApiException { /** * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and * paginated with 'start' position and 'count' of messages + * + * @deprecated Use the API endpoints in the 'exim' add-on instead. */ + @Deprecated public byte[] messagesHar(String baseurl, String start, String count) throws ClientApiException { Map map = new HashMap<>(); @@ -783,7 +914,12 @@ public byte[] messagesHar(String baseurl, String start, String count) return api.callApiOther("core", "other", "messagesHar", map); } - /** Gets the HTTP messages with the given IDs, in HAR format. */ + /** + * Gets the HTTP messages with the given IDs, in HAR format. + * + * @deprecated Use the API endpoints in the 'exim' add-on instead. + */ + @Deprecated public byte[] messagesHarById(String ids) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); @@ -795,7 +931,10 @@ public byte[] messagesHarById(String ids) throws ClientApiException { * the request sent and response received and followed redirections, if any. The Mode is * enforced when sending the request (and following redirections), custom manual requests are * not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. + * + * @deprecated Use the API endpoints in the 'exim' add-on instead. */ + @Deprecated public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { Map map = new HashMap<>(); map.put("request", request); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java new file mode 100644 index 0000000..1567ca1 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java @@ -0,0 +1,129 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2022 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Exim { + + private final ClientApi api; + + public Exim(ClientApi api) { + this.api = api; + } + + /** + * Imports a HAR file. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importHar(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "importHar", map); + } + + /** + * Imports URLs (one per line) from the file with the given file system path. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrls(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "importUrls", map); + } + + /** + * Imports previously exported ZAP messages from the file with the given file system path. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importZapLogs(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "importZapLogs", map); + } + + /** + * Imports ModSecurity2 logs from the file with the given file system path. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importModsec2Logs(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "importModsec2Logs", map); + } + + /** + * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and + * paginated with 'start' position and 'count' of messages + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] exportHar(String baseurl, String start, String count) throws ClientApiException { + Map map = new HashMap<>(); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("exim", "other", "exportHar", map); + } + + /** + * Gets the HTTP messages with the given IDs, in HAR format. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] exportHarById(String ids) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ids", ids); + return api.callApiOther("exim", "other", "exportHarById", map); + } + + /** + * Sends the first HAR request entry, optionally following redirections. Returns, in HAR format, + * the request sent and response received and followed redirections, if any. The Mode is + * enforced when sending the request (and following redirections), custom manual requests are + * not allowed in 'Safe' mode nor in 'Protected' mode if out of scope. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] sendHarRequest(String request, String followredirects) throws ClientApiException { + Map map = new HashMap<>(); + map.put("request", request); + if (followredirects != null) { + map.put("followRedirects", followredirects); + } + return api.callApiOther("exim", "other", "sendHarRequest", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java index 05f42ba..94ea1bb 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java @@ -25,8 +25,13 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** This file was automatically generated. */ +/** + * This file was automatically generated. + * + * @deprecated Use {@link Exim} instead. + */ @SuppressWarnings("javadoc") +@Deprecated public class ImportLogFiles extends org.zaproxy.clientapi.gen.deprecated.ImportLogFilesDeprecated { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java index 61dee90..829d733 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -25,8 +25,13 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** This file was automatically generated. */ +/** + * This file was automatically generated. + * + * @deprecated Use {@link Exim} instead. + */ @SuppressWarnings("javadoc") +@Deprecated public class Importurls { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java index dbcd03e..0245784 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java @@ -25,8 +25,13 @@ import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; -/** This file was automatically generated. */ +/** + * This file was automatically generated. + * + * @deprecated Use {@link Network} instead. + */ @SuppressWarnings("javadoc") +@Deprecated public class LocalProxies { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java new file mode 100644 index 0000000..54fcbb3 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java @@ -0,0 +1,565 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2022 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Network { + + private final ClientApi api; + + public Network(ClientApi api) { + this.api = api; + } + + /** + * Gets the Root CA certificate validity, in days. Used when generating a new Root CA + * certificate. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getRootCaCertValidity() throws ClientApiException { + return api.callApi("network", "view", "getRootCaCertValidity", null); + } + + /** + * Gets the server certificate validity, in days. Used when generating server certificates. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getServerCertValidity() throws ClientApiException { + return api.callApi("network", "view", "getServerCertValidity", null); + } + + /** + * Gets the aliases used to identify the local servers/proxies. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getAliases() throws ClientApiException { + return api.callApi("network", "view", "getAliases", null); + } + + /** + * Gets the local servers/proxies. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getLocalServers() throws ClientApiException { + return api.callApi("network", "view", "getLocalServers", null); + } + + /** + * Gets the authorities that will pass-through the local proxies. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getPassThroughs() throws ClientApiException { + return api.callApi("network", "view", "getPassThroughs", null); + } + + /** + * Gets the connection timeout, in seconds. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getConnectionTimeout() throws ClientApiException { + return api.callApi("network", "view", "getConnectionTimeout", null); + } + + /** + * Gets the default user-agent. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getDefaultUserAgent() throws ClientApiException { + return api.callApi("network", "view", "getDefaultUserAgent", null); + } + + /** + * Gets the TTL (in seconds) of successful DNS queries. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getDnsTtlSuccessfulQueries() throws ClientApiException { + return api.callApi("network", "view", "getDnsTtlSuccessfulQueries", null); + } + + /** + * Gets the HTTP proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getHttpProxy() throws ClientApiException { + return api.callApi("network", "view", "getHttpProxy", null); + } + + /** + * Gets the HTTP proxy exclusions. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getHttpProxyExclusions() throws ClientApiException { + return api.callApi("network", "view", "getHttpProxyExclusions", null); + } + + /** + * Gets the SOCKS proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getSocksProxy() throws ClientApiException { + return api.callApi("network", "view", "getSocksProxy", null); + } + + /** + * Tells whether or not the HTTP proxy authentication is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse isHttpProxyAuthEnabled() throws ClientApiException { + return api.callApi("network", "view", "isHttpProxyAuthEnabled", null); + } + + /** + * Tells whether or not the HTTP proxy is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse isHttpProxyEnabled() throws ClientApiException { + return api.callApi("network", "view", "isHttpProxyEnabled", null); + } + + /** + * Tells whether or not the SOCKS proxy is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse isSocksProxyEnabled() throws ClientApiException { + return api.callApi("network", "view", "isSocksProxyEnabled", null); + } + + /** + * Tells whether or not to use global HTTP state. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse isUseGlobalHttpState() throws ClientApiException { + return api.callApi("network", "view", "isUseGlobalHttpState", null); + } + + /** + * Generates a new Root CA certificate, used to issue server certificates. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse generateRootCaCert() throws ClientApiException { + return api.callApi("network", "action", "generateRootCaCert", null); + } + + /** + * Imports a Root CA certificate to be used to issue server certificates. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importRootCaCert(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("network", "action", "importRootCaCert", map); + } + + /** + * Sets the Root CA certificate validity. Used when generating a new Root CA certificate. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setRootCaCertValidity(String validity) throws ClientApiException { + Map map = new HashMap<>(); + map.put("validity", validity); + return api.callApi("network", "action", "setRootCaCertValidity", map); + } + + /** + * Sets the server certificate validity. Used when generating server certificates. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setServerCertValidity(String validity) throws ClientApiException { + Map map = new HashMap<>(); + map.put("validity", validity); + return api.callApi("network", "action", "setServerCertValidity", map); + } + + /** + * Adds an alias for the local servers/proxies. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addAlias(String name, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("network", "action", "addAlias", map); + } + + /** + * Adds a local server/proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addLocalServer( + String address, + String port, + String api, + String proxy, + String behindnat, + String decoderesponse, + String removeacceptencoding) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("address", address); + map.put("port", port); + if (api != null) { + map.put("api", api); + } + if (proxy != null) { + map.put("proxy", proxy); + } + if (behindnat != null) { + map.put("behindNat", behindnat); + } + if (decoderesponse != null) { + map.put("decodeResponse", decoderesponse); + } + if (removeacceptencoding != null) { + map.put("removeAcceptEncoding", removeacceptencoding); + } + return this.api.callApi("network", "action", "addLocalServer", map); + } + + /** + * Adds an authority to pass-through the local proxies. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addPassThrough(String authority, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("authority", authority); + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("network", "action", "addPassThrough", map); + } + + /** + * Removes an alias. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeAlias(String name) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + return api.callApi("network", "action", "removeAlias", map); + } + + /** + * Removes a local server/proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeLocalServer(String address, String port) throws ClientApiException { + Map map = new HashMap<>(); + map.put("address", address); + map.put("port", port); + return api.callApi("network", "action", "removeLocalServer", map); + } + + /** + * Removes a pass-through. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removePassThrough(String authority) throws ClientApiException { + Map map = new HashMap<>(); + map.put("authority", authority); + return api.callApi("network", "action", "removePassThrough", map); + } + + /** + * Sets whether or not an alias is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setAliasEnabled(String name, String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + map.put("enabled", enabled); + return api.callApi("network", "action", "setAliasEnabled", map); + } + + /** + * Sets whether or not a pass-through is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setPassThroughEnabled(String authority, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("authority", authority); + map.put("enabled", enabled); + return api.callApi("network", "action", "setPassThroughEnabled", map); + } + + /** + * Sets the timeout, for reads and connects. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setConnectionTimeout(String timeout) throws ClientApiException { + Map map = new HashMap<>(); + map.put("timeout", timeout); + return api.callApi("network", "action", "setConnectionTimeout", map); + } + + /** + * Sets the default user-agent. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setDefaultUserAgent(String useragent) throws ClientApiException { + Map map = new HashMap<>(); + map.put("userAgent", useragent); + return api.callApi("network", "action", "setDefaultUserAgent", map); + } + + /** + * Sets the TTL of successful DNS queries. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setDnsTtlSuccessfulQueries(String ttl) throws ClientApiException { + Map map = new HashMap<>(); + map.put("ttl", ttl); + return api.callApi("network", "action", "setDnsTtlSuccessfulQueries", map); + } + + /** + * Adds a host to be excluded from the HTTP proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addHttpProxyExclusion(String host, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("host", host); + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("network", "action", "addHttpProxyExclusion", map); + } + + /** + * Removes a HTTP proxy exclusion. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeHttpProxyExclusion(String host) throws ClientApiException { + Map map = new HashMap<>(); + map.put("host", host); + return api.callApi("network", "action", "removeHttpProxyExclusion", map); + } + + /** + * Sets the HTTP proxy configuration. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setHttpProxy( + String host, String port, String realm, String username, String password) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("host", host); + map.put("port", port); + if (realm != null) { + map.put("realm", realm); + } + if (username != null) { + map.put("username", username); + } + if (password != null) { + map.put("password", password); + } + return api.callApi("network", "action", "setHttpProxy", map); + } + + /** + * Sets whether or not the HTTP proxy authentication is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setHttpProxyAuthEnabled(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("network", "action", "setHttpProxyAuthEnabled", map); + } + + /** + * Sets whether or not the HTTP proxy is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setHttpProxyEnabled(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("network", "action", "setHttpProxyEnabled", map); + } + + /** + * Sets whether or not a HTTP proxy exclusion is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setHttpProxyExclusionEnabled(String host, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("host", host); + map.put("enabled", enabled); + return api.callApi("network", "action", "setHttpProxyExclusionEnabled", map); + } + + /** + * Sets the SOCKS proxy configuration. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setSocksProxy( + String host, + String port, + String version, + String usedns, + String username, + String password) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("host", host); + map.put("port", port); + if (version != null) { + map.put("version", version); + } + if (usedns != null) { + map.put("useDns", usedns); + } + if (username != null) { + map.put("username", username); + } + if (password != null) { + map.put("password", password); + } + return api.callApi("network", "action", "setSocksProxy", map); + } + + /** + * Sets whether or not the SOCKS proxy is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setSocksProxyEnabled(String enabled) throws ClientApiException { + Map map = new HashMap<>(); + map.put("enabled", enabled); + return api.callApi("network", "action", "setSocksProxyEnabled", map); + } + + /** + * Sets whether or not to use the global HTTP state. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setUseGlobalHttpState(String use) throws ClientApiException { + Map map = new HashMap<>(); + map.put("use", use); + return api.callApi("network", "action", "setUseGlobalHttpState", map); + } + + /** + * Adds a client certificate contained in a PKCS#12 file, the certificate is automatically set + * as active and used. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addPkcs12ClientCertificate(String filepath, String password, String index) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + map.put("password", password); + if (index != null) { + map.put("index", index); + } + return api.callApi("network", "action", "addPkcs12ClientCertificate", map); + } + + /** + * Sets whether or not to use the active client certificate. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setUseClientCertificate(String use) throws ClientApiException { + Map map = new HashMap<>(); + map.put("use", use); + return api.callApi("network", "action", "setUseClientCertificate", map); + } + + /** + * Provides a PAC file, proxying through the main proxy. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] proxypac() throws ClientApiException { + return api.callApiOther("network", "other", "proxy.pac", null); + } + + /** + * Sets the HTTP proxy configuration. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] setProxy(String proxy) throws ClientApiException { + Map map = new HashMap<>(); + map.put("proxy", proxy); + return api.callApiOther("network", "other", "setProxy", map); + } + + /** + * Gets the Root CA certificate used to issue server certificates. Suitable to import into + * client applications (e.g. browsers). + * + *

This component is optional and therefore the API will only work if it is installed + */ + public byte[] rootCaCert() throws ClientApiException { + return api.callApiOther("network", "other", "rootCaCert", null); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index fb21b58..dd0b6e3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -48,16 +48,26 @@ public ApiResponse recordsToScan() throws ClientApiException { return api.callApi("pscan", "view", "recordsToScan", null); } - /** Lists all passive scanners with its ID, name, enabled state and alert threshold. */ + /** Lists all passive scan rules with their ID, name, enabled state, and alert threshold. */ public ApiResponse scanners() throws ClientApiException { return api.callApi("pscan", "view", "scanners", null); } - /** Show information about the passive scan rule currently being run (if any). */ + /** + * Show information about the passive scan rule currently being run (if any). + * + * @deprecated Use the currentTasks view instead. + */ + @Deprecated public ApiResponse currentRule() throws ClientApiException { return api.callApi("pscan", "view", "currentRule", null); } + /** Show information about the passive scan tasks currently being run (if any). */ + public ApiResponse currentTasks() throws ClientApiException { + return api.callApi("pscan", "view", "currentTasks", null); + } + /** Gets the maximum number of alerts a passive scan rule should raise. */ public ApiResponse maxAlertsPerRule() throws ClientApiException { return api.callApi("pscan", "view", "maxAlertsPerRule", null); @@ -82,24 +92,24 @@ public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiExcept return api.callApi("pscan", "action", "setScanOnlyInScope", map); } - /** Enables all passive scanners */ + /** Enables all passive scan rules */ public ApiResponse enableAllScanners() throws ClientApiException { return api.callApi("pscan", "action", "enableAllScanners", null); } - /** Disables all passive scanners */ + /** Disables all passive scan rules */ public ApiResponse disableAllScanners() throws ClientApiException { return api.callApi("pscan", "action", "disableAllScanners", null); } - /** Enables all passive scanners with the given IDs (comma separated list of IDs) */ + /** Enables all passive scan rules with the given IDs (comma separated list of IDs) */ public ApiResponse enableScanners(String ids) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); return api.callApi("pscan", "action", "enableScanners", map); } - /** Disables all passive scanners with the given IDs (comma separated list of IDs) */ + /** Disables all passive scan rules with the given IDs (comma separated list of IDs) */ public ApiResponse disableScanners(String ids) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); @@ -134,4 +144,9 @@ public ApiResponse disableAllTags() throws ClientApiException { public ApiResponse enableAllTags() throws ClientApiException { return api.callApi("pscan", "action", "enableAllTags", null); } + + /** Clears the passive scan queue. */ + public ApiResponse clearQueue() throws ClientApiException { + return api.callApi("pscan", "action", "clearQueue", null); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 45ba39d..4ad39f6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -24,14 +24,16 @@ import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; +import org.zaproxy.clientapi.gen.deprecated.ReplacerDeprecated; /** This file was automatically generated. */ @SuppressWarnings("javadoc") -public class Replacer { +public class Replacer extends ReplacerDeprecated { private final ClientApi api; public Replacer(ClientApi api) { + super(api); this.api = api; } @@ -62,7 +64,8 @@ public ApiResponse addRule( String matchregex, String matchstring, String replacement, - String initiators) + String initiators, + String url) throws ClientApiException { Map map = new HashMap<>(); map.put("description", description); @@ -76,6 +79,9 @@ public ApiResponse addRule( if (initiators != null) { map.put("initiators", initiators); } + if (url != null) { + map.put("url", url); + } return api.callApi("replacer", "action", "addRule", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 2e54c0b..a87ac20 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -36,6 +36,7 @@ public Spider(ClientApi api) { this.api = api; } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse status(String scanid) throws ClientApiException { Map map = new HashMap<>(); if (scanid != null) { @@ -44,6 +45,7 @@ public ApiResponse status(String scanid) throws ClientApiException { return api.callApi("spider", "view", "status", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse results(String scanid) throws ClientApiException { Map map = new HashMap<>(); if (scanid != null) { @@ -52,17 +54,23 @@ public ApiResponse results(String scanid) throws ClientApiException { return api.callApi("spider", "view", "results", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse fullResults(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "view", "fullResults", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse scans() throws ClientApiException { return api.callApi("spider", "view", "scans", null); } - /** Gets the regexes of URLs excluded from the spider scans. */ + /** + * Gets the regexes of URLs excluded from the spider scans. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse excludedFromScan() throws ClientApiException { return api.callApi("spider", "view", "excludedFromScan", null); } @@ -70,12 +78,18 @@ public ApiResponse excludedFromScan() throws ClientApiException { /** * Returns a list of unique URLs from the history table based on HTTP messages added by the * Spider. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse allUrls() throws ClientApiException { return api.callApi("spider", "view", "allUrls", null); } - /** Returns a list of the names of the nodes added to the Sites tree by the specified scan. */ + /** + * Returns a list of the names of the nodes added to the Sites tree by the specified scan. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse addedNodes(String scanid) throws ClientApiException { Map map = new HashMap<>(); if (scanid != null) { @@ -87,6 +101,8 @@ public ApiResponse addedNodes(String scanid) throws ClientApiException { /** * Gets all the domains that are always in scope. For each domain the following are shown: the * index, the value (domain), if enabled, and if specified as a regex. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse domainsAlwaysInScope() throws ClientApiException { return api.callApi("spider", "view", "domainsAlwaysInScope", null); @@ -95,6 +111,8 @@ public ApiResponse domainsAlwaysInScope() throws ClientApiException { /** * Use view domainsAlwaysInScope instead. * + *

This component is optional and therefore the API will only work if it is installed + * * @deprecated */ @Deprecated @@ -105,6 +123,8 @@ public ApiResponse optionDomainsAlwaysInScope() throws ClientApiException { /** * Use view domainsAlwaysInScope instead. * + *

This component is optional and therefore the API will only work if it is installed + * * @deprecated */ @Deprecated @@ -112,103 +132,127 @@ public ApiResponse optionDomainsAlwaysInScopeEnabled() throws ClientApiException return api.callApi("spider", "view", "optionDomainsAlwaysInScopeEnabled", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionHandleParameters() throws ClientApiException { return api.callApi("spider", "view", "optionHandleParameters", null); } - /** Gets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. */ + /** + * Gets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxChildren() throws ClientApiException { return api.callApi("spider", "view", "optionMaxChildren", null); } - /** Gets the maximum depth the spider can crawl, 0 if unlimited. */ + /** + * Gets the maximum depth the spider can crawl, 0 if unlimited. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxDepth() throws ClientApiException { return api.callApi("spider", "view", "optionMaxDepth", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionMaxDuration() throws ClientApiException { return api.callApi("spider", "view", "optionMaxDuration", null); } - /** Gets the maximum size, in bytes, that a response might have to be parsed. */ + /** + * Gets the maximum size, in bytes, that a response might have to be parsed. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionMaxParseSizeBytes() throws ClientApiException { return api.callApi("spider", "view", "optionMaxParseSizeBytes", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionMaxScansInUI() throws ClientApiException { return api.callApi("spider", "view", "optionMaxScansInUI", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionRequestWaitTime() throws ClientApiException { return api.callApi("spider", "view", "optionRequestWaitTime", null); } - /** @deprecated Option no longer in effective use. */ - @Deprecated - public ApiResponse optionScope() throws ClientApiException { - return api.callApi("spider", "view", "optionScope", null); - } - - /** @deprecated Option no longer in effective use. */ - @Deprecated - public ApiResponse optionScopeText() throws ClientApiException { - return api.callApi("spider", "view", "optionScopeText", null); - } - + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionSkipURLString() throws ClientApiException { return api.callApi("spider", "view", "optionSkipURLString", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionThreadCount() throws ClientApiException { return api.callApi("spider", "view", "optionThreadCount", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionUserAgent() throws ClientApiException { return api.callApi("spider", "view", "optionUserAgent", null); } - /** Gets whether or not a spider process should accept cookies while spidering. */ + /** + * Gets whether or not a spider process should accept cookies while spidering. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionAcceptCookies() throws ClientApiException { return api.callApi("spider", "view", "optionAcceptCookies", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionHandleODataParametersVisited() throws ClientApiException { return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseComments() throws ClientApiException { return api.callApi("spider", "view", "optionParseComments", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseGit() throws ClientApiException { return api.callApi("spider", "view", "optionParseGit", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseRobotsTxt() throws ClientApiException { return api.callApi("spider", "view", "optionParseRobotsTxt", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseSVNEntries() throws ClientApiException { return api.callApi("spider", "view", "optionParseSVNEntries", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseSitemapXml() throws ClientApiException { return api.callApi("spider", "view", "optionParseSitemapXml", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionPostForm() throws ClientApiException { return api.callApi("spider", "view", "optionPostForm", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionProcessForm() throws ClientApiException { return api.callApi("spider", "view", "optionProcessForm", null); } - /** Gets whether or not the 'Referer' header should be sent while spidering. */ + /** + * Gets whether or not the 'Referer' header should be sent while spidering. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse optionSendRefererHeader() throws ClientApiException { return api.callApi("spider", "view", "optionSendRefererHeader", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionShowAdvancedDialog() throws ClientApiException { return api.callApi("spider", "view", "optionShowAdvancedDialog", null); } @@ -219,6 +263,8 @@ public ApiResponse optionShowAdvancedDialog() throws ClientApiException { * prevent the spider from seeding recursively, the parameter 'contextName' can be used to * constrain the scan to a Context and the parameter 'subtreeOnly' allows to restrict the spider * under a site's subtree (using the specified 'url'). + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse scan( String url, String maxchildren, String recurse, String contextname, String subtreeonly) @@ -245,6 +291,8 @@ public ApiResponse scan( /** * Runs the spider from the perspective of a User, obtained using the given Context ID and User * ID. See 'scan' action for more details. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse scanAsUser( String contextid, @@ -272,18 +320,21 @@ public ApiResponse scanAsUser( return api.callApi("spider", "action", "scanAsUser", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse pause(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "pause", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse resume(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "resume", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse stop(String scanid) throws ClientApiException { Map map = new HashMap<>(); if (scanid != null) { @@ -292,34 +343,47 @@ public ApiResponse stop(String scanid) throws ClientApiException { return api.callApi("spider", "action", "stop", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse removeScan(String scanid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); return api.callApi("spider", "action", "removeScan", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse pauseAllScans() throws ClientApiException { return api.callApi("spider", "action", "pauseAllScans", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse resumeAllScans() throws ClientApiException { return api.callApi("spider", "action", "resumeAllScans", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse stopAllScans() throws ClientApiException { return api.callApi("spider", "action", "stopAllScans", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse removeAllScans() throws ClientApiException { return api.callApi("spider", "action", "removeAllScans", null); } - /** Clears the regexes of URLs excluded from the spider scans. */ + /** + * Clears the regexes of URLs excluded from the spider scans. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearExcludedFromScan() throws ClientApiException { return api.callApi("spider", "action", "clearExcludedFromScan", null); } - /** Adds a regex of URLs that should be excluded from the spider scans. */ + /** + * Adds a regex of URLs that should be excluded from the spider scans. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse excludeFromScan(String regex) throws ClientApiException { Map map = new HashMap<>(); map.put("regex", regex); @@ -330,6 +394,8 @@ public ApiResponse excludeFromScan(String regex) throws ClientApiException { * Adds a new domain that's always in scope, using the specified value. Optionally sets if the * new entry is enabled (default, true) and whether or not the new value is specified as a regex * (default, false). + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse addDomainAlwaysInScope(String value, String isregex, String isenabled) throws ClientApiException { @@ -348,6 +414,8 @@ public ApiResponse addDomainAlwaysInScope(String value, String isregex, String i * Modifies a domain that's always in scope. Allows to modify the value, if enabled or if a * regex. The domain is selected with its index, which can be obtained with the view * domainsAlwaysInScope. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse modifyDomainAlwaysInScope( String idx, String value, String isregex, String isenabled) throws ClientApiException { @@ -368,6 +436,8 @@ public ApiResponse modifyDomainAlwaysInScope( /** * Removes a domain that's always in scope, with the given index. The index can be obtained with * the view domainsAlwaysInScope. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse removeDomainAlwaysInScope(String idx) throws ClientApiException { Map map = new HashMap<>(); @@ -375,53 +445,57 @@ public ApiResponse removeDomainAlwaysInScope(String idx) throws ClientApiExcepti return api.callApi("spider", "action", "removeDomainAlwaysInScope", map); } - /** Enables all domains that are always in scope. */ + /** + * Enables all domains that are always in scope. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse enableAllDomainsAlwaysInScope() throws ClientApiException { return api.callApi("spider", "action", "enableAllDomainsAlwaysInScope", null); } - /** Disables all domains that are always in scope. */ + /** + * Disables all domains that are always in scope. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse disableAllDomainsAlwaysInScope() throws ClientApiException { return api.callApi("spider", "action", "disableAllDomainsAlwaysInScope", null); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionHandleParameters(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionHandleParameters", map); } - /** - * Use actions [add|modify|remove]DomainAlwaysInScope instead. - * - * @deprecated Option no longer in effective use. - */ - @Deprecated - public ApiResponse setOptionScopeString(String string) throws ClientApiException { - Map map = new HashMap<>(); - map.put("String", string); - return api.callApi("spider", "action", "setOptionScopeString", map); - } - + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionSkipURLString(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionSkipURLString", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionUserAgent(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); return api.callApi("spider", "action", "setOptionUserAgent", map); } - /** Sets whether or not a spider process should accept cookies while spidering. */ + /** + * Sets whether or not a spider process should accept cookies while spidering. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionAcceptCookies(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionAcceptCookies", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionHandleODataParametersVisited(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -429,20 +503,29 @@ public ApiResponse setOptionHandleODataParametersVisited(boolean bool) return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); } - /** Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. */ + /** + * Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionMaxChildren(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxChildren", map); } - /** Sets the maximum depth the spider can crawl, 0 for unlimited depth. */ + /** + * Sets the maximum depth the spider can crawl, 0 for unlimited depth. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionMaxDepth(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxDepth", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); @@ -452,6 +535,8 @@ public ApiResponse setOptionMaxDuration(int i) throws ClientApiException { /** * Sets the maximum size, in bytes, that a response might have to be parsed. This allows the * spider to skip big responses/files. + * + *

This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionMaxParseSizeBytes(int i) throws ClientApiException { Map map = new HashMap<>(); @@ -459,73 +544,88 @@ public ApiResponse setOptionMaxParseSizeBytes(int i) throws ClientApiException { return api.callApi("spider", "action", "setOptionMaxParseSizeBytes", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionMaxScansInUI", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseComments(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseComments", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseGit(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseGit", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseRobotsTxt(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseRobotsTxt", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseSVNEntries(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseSVNEntries", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseSitemapXml(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionParseSitemapXml", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionPostForm(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionPostForm", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionProcessForm(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionProcessForm", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionRequestWaitTime", map); } - /** Sets whether or not the 'Referer' header should be sent while spidering. */ + /** + * Sets whether or not the 'Referer' header should be sent while spidering. + * + *

This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setOptionSendRefererHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionSendRefererHeader", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionShowAdvancedDialog(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); return api.callApi("spider", "action", "setOptionShowAdvancedDialog", map); } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionThreadCount(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java index 312522d..de47511 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AcsrfDeprecated.java @@ -79,4 +79,14 @@ public byte[] genForm(String apikey, String hrefid) throws ClientApiException { map.put("hrefId", hrefid); return api.callApiOther("acsrf", "other", "genForm", map); } + + /** Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ + public byte[] genFormWithUrl(String hrefid, String actionurl) throws ClientApiException { + Map map = new HashMap<>(); + map.put("hrefId", hrefid); + if (actionurl != null) { + map.put("actionUrl", actionurl); + } + return api.callApiOther("acsrf", "other", "genForm", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java index a95658c..71c5f05 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AscanDeprecated.java @@ -449,6 +449,11 @@ public ApiResponse addScanPolicy(String apikey, String scanpolicyname) return api.callApi("ascan", "action", "addScanPolicy", map); } + @Deprecated + public ApiResponse addScanPolicy(String scanpolicyname) throws ClientApiException { + return addScanPolicy(scanpolicyname, null); + } + /** * @deprecated (1.1.0) Use the method without the API key and use one of the {@code ClientApi} * constructors that allow to set the API key (e.g. {@link ClientApi#ClientApi(String, int, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java new file mode 100644 index 0000000..68b48a8 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java @@ -0,0 +1,63 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2022 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** API implementation with deprecated methods, (re)moved from generated class. */ +@SuppressWarnings("javadoc") +public class ReplacerDeprecated { + + private final ClientApi api; + + public ReplacerDeprecated(ClientApi api) { + this.api = api; + } + + /** @deprecated (1.11.0) Use the method with the url. */ + @Deprecated + public ApiResponse addRule( + String description, + String enabled, + String matchtype, + String matchregex, + String matchstring, + String replacement, + String initiators) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("enabled", enabled); + map.put("matchType", matchtype); + map.put("matchRegex", matchregex); + map.put("matchString", matchstring); + if (replacement != null) { + map.put("replacement", replacement); + } + if (initiators != null) { + map.put("initiators", initiators); + } + return api.callApi("replacer", "action", "addRule", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java index ffc9421..cd994ae 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -548,4 +548,28 @@ public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiEx map.put("Integer", Integer.toString(i)); return api.callApi("spider", "action", "setOptionThreadCount", map); } + + /** @deprecated Option no longer in effective use. */ + @Deprecated + public ApiResponse optionScope() throws ClientApiException { + return api.callApi("spider", "view", "optionScope", null); + } + + /** @deprecated Option no longer in effective use. */ + @Deprecated + public ApiResponse optionScopeText() throws ClientApiException { + return api.callApi("spider", "view", "optionScopeText", null); + } + + /** + * Use actions [add|modify|remove]DomainAlwaysInScope instead. + * + * @deprecated Option no longer in effective use. + */ + @Deprecated + public ApiResponse setOptionScopeString(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("spider", "action", "setOptionScopeString", map); + } } diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 2e78082..16dd18c 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,7 +1,7 @@ plugins { id "maven-publish" id "signing" - id "me.champeau.gradle.japicmp" version "0.2.9" + id "me.champeau.gradle.japicmp" version "0.4.1" } sourceSets { examples } @@ -41,14 +41,16 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { group 'verification' description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." - oldClasspath = files(clientapiJar(versionBC)) - newClasspath = files(tasks.named(JavaPlugin.JAR_TASK_NAME).map { it.archivePath }) - onlyBinaryIncompatibleModified = true - failOnModification = true - ignoreMissingClasses = true - htmlOutputFile = file("$buildDir/reports/japi.html") + oldClasspath.from(files(clientapiJar(versionBC))) + newClasspath.from(files(tasks.named(JavaPlugin.JAR_TASK_NAME).map { it.archivePath })) + onlyBinaryIncompatibleModified.set(true) + failOnModification.set(true) + ignoreMissingClasses.set(true) + htmlOutputFile.set(file("$buildDir/reports/japi.html")) } +check.dependsOn(japicmp) + task javadocJar(type: Jar) { classifier = 'javadoc' from javadoc From 706767fad5d36c5d9a942f5dd1525f99df6461e8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 1 Nov 2022 13:57:24 +0000 Subject: [PATCH 105/148] Release 1.11.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b55ef7..33ca85d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.11.0] - 2022-11-01 ### Added - Add the APIs of the following add-ons: - Import/Export version 0.3.0; @@ -162,7 +162,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...HEAD +[1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/zaproxy/zap-api-java/compare/v1.7.0...v1.8.0 diff --git a/README.md b/README.md index 471b9db..53e5f83 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.10.0` + * Version: `1.11.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle b/build.gradle index 7961855..258f960 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ subprojects { group = 'org.zaproxy' - version '1.11.0-SNAPSHOT' + version '1.11.0' ext.versionBC = '1.10.0' repositories { From 156016b85c106925704687eebb4ac5fa1183ea8f Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 1 Nov 2022 14:46:04 +0000 Subject: [PATCH 106/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33ca85d..a09b3b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.11.0] - 2022-11-01 ### Added - Add the APIs of the following add-ons: @@ -162,6 +164,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...HEAD [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 diff --git a/build.gradle b/build.gradle index 258f960..d44fd34 100644 --- a/build.gradle +++ b/build.gradle @@ -12,8 +12,8 @@ subprojects { group = 'org.zaproxy' - version '1.11.0' - ext.versionBC = '1.10.0' + version '1.12.0-SNAPSHOT' + ext.versionBC = '1.11.0' repositories { mavenCentral() From 8c27b1cf585adf6a8c7cf2fc60855159e0788773 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 7 Feb 2023 14:53:56 +0000 Subject: [PATCH 107/148] Update Java and Gradle Use Java 11 as minimum version. Update Gradle Wrapper to 7.6 and plugins to support newer Java versions. Address Error Prone check and disable some that don't apply to the generated code. Update Ant to latest version. Signed-off-by: thc202 --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 2 ++ build.gradle | 19 +++++++++++------- gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 5 +++-- gradlew | 18 +++++++++++++---- gradlew.bat | 15 ++++++++------ .../zap-clientapi-ant.gradle | 4 ++-- .../org/zaproxy/clientapi/core/Alert.java | 5 +---- 9 files changed, 44 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a836beb..9c8834c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [8, 11] + java: [11] steps: - uses: actions/checkout@v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index a09b3b5..85bec80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Minimum Java version is now 11. ## [1.11.0] - 2022-11-01 ### Added diff --git a/build.gradle b/build.gradle index d44fd34..5460274 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id "com.diffplug.spotless" version "5.12.1" - id "net.ltgt.errorprone" version "2.0.1" + id "com.diffplug.spotless" version "6.14.1" + id "net.ltgt.errorprone" version "3.0.1" } apply from: "gradle/compile.gradle" @@ -19,8 +19,8 @@ subprojects { mavenCentral() } - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 spotless { java { @@ -31,9 +31,14 @@ subprojects { } dependencies { - errorprone 'com.google.errorprone:error_prone_core:2.3.1' - if (JavaVersion.current() == JavaVersion.VERSION_1_8) { - errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") + errorprone 'com.google.errorprone:error_prone_core:2.18.0' + } + + tasks.withType(JavaCompile).configureEach { + options.encoding = "utf-8" + options.compilerArgs = ["-Xlint:all", "-Xlint:-path", "-Xlint:-options", "-Werror"] + options.errorprone { + disable("EmptyBlockTag", "InlineMeSuggester") } } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4fb3f96a785543079b8df6723c946b..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36987 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 z 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 VBfu2+*qg&~f-ihLS3eum{s(|${^$Sz diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index db3bccc..bc073f6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=a9a7b7baba105f6557c9dcf9c3c6e8f7e57e6b49889c5f1d133f015d0727e4be -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-all.zip +distributionSha256Sum=312eb12875e1747e05c2f81a4789902d7e4ec5defbd1eefeaccc08acf096505d +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..65dcd68 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index cec1707..af98c95 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -1,9 +1,9 @@ dependencies { implementation project(':zap-clientapi') - compileOnly 'org.apache.ant:ant:1.9.7' + compileOnly 'org.apache.ant:ant:1.10.13' - testImplementation 'org.apache.ant:ant-testutil:1.9.7' + testImplementation 'org.apache.ant:ant-testutil:1.10.13' testImplementation 'org.nanohttpd:nanohttpd:2.3.1' } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index 3aa7250..e781ff3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -437,10 +437,7 @@ public boolean equals(Object object) { if (this == object) { return true; } - if (object == null) { - return false; - } - if (getClass() != object.getClass()) { + if (!(object instanceof Alert)) { return false; } Alert otherAlert = (Alert) object; From 73297ceb82a96a2a710763f2caffb2cbbc1efb61 Mon Sep 17 00:00:00 2001 From: thc202 Date: Thu, 13 Jul 2023 18:32:21 +0100 Subject: [PATCH 108/148] Update APIs of add-ons and core Update core APIs for 2.13.0. Update the APIs of the following add-ons: - AJAX Spider version 23.15.0; - Alert Filters version 17; - GraphQL Support version 0.18.0; - Network version 0.10.0; - Selenium version 15.13.0; - Spider version 0.5.0. Prepare release. Signed-off-by: thc202 --- CHANGELOG.md | 12 +- README.md | 2 +- build.gradle | 2 +- .../org/zaproxy/clientapi/gen/AjaxSpider.java | 103 ++++++ .../zaproxy/clientapi/gen/AlertFilter.java | 87 ++--- .../java/org/zaproxy/clientapi/gen/Ascan.java | 22 +- .../org/zaproxy/clientapi/gen/Graphql.java | 20 ++ .../org/zaproxy/clientapi/gen/Network.java | 60 +++- .../java/org/zaproxy/clientapi/gen/Pscan.java | 4 +- .../org/zaproxy/clientapi/gen/Selenium.java | 14 +- .../org/zaproxy/clientapi/gen/Spider.java | 12 + .../gen/deprecated/AlertFilterDeprecated.java | 304 ++++++++++++++++++ 12 files changed, 559 insertions(+), 83 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AlertFilterDeprecated.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 85bec80..002bf9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.12.0] - 2023-07-13 ### Changed - Minimum Java version is now 11. +- Update core APIs for 2.13. +- Update the APIs of the following add-ons: + - AJAX Spider version 23.15.0; + - Alert Filters version 17; + - GraphQL Support version 0.18.0; + - Network version 0.10.0; + - Selenium version 15.13.0; + - Spider version 0.5.0. ## [1.11.0] - 2022-11-01 ### Added @@ -166,7 +174,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...HEAD +[1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 [1.9.0]: https://github.com/zaproxy/zap-api-java/compare/v1.8.0...v1.9.0 diff --git a/README.md b/README.md index 53e5f83..8ca2813 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.11.0` + * Version: `1.12.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle b/build.gradle index 5460274..746f89f 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ subprojects { group = 'org.zaproxy' - version '1.12.0-SNAPSHOT' + version '1.12.0' ext.versionBC = '1.11.0' repositories { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 75b5e64..5e511ba 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -46,6 +46,18 @@ public ApiResponse allowedResources() throws ClientApiException { return api.callApi("ajaxSpider", "view", "allowedResources", null); } + /** + * Gets the excluded elements. The excluded elements are not clicked during crawling, for + * example, to prevent logging out. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse excludedElements(String contextname) throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + return api.callApi("ajaxSpider", "view", "excludedElements", map); + } + /** * Gets the current status of the crawler. Actual values are Stopped and Running. * @@ -250,6 +262,97 @@ public ApiResponse addAllowedResource(String regex, String enabled) throws Clien return api.callApi("ajaxSpider", "action", "addAllowedResource", map); } + /** + * Adds an excluded element to a context. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addExcludedElement( + String contextname, + String description, + String element, + String xpath, + String text, + String attributename, + String attributevalue, + String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("description", description); + map.put("element", element); + if (xpath != null) { + map.put("xpath", xpath); + } + if (text != null) { + map.put("text", text); + } + if (attributename != null) { + map.put("attributeName", attributename); + } + if (attributevalue != null) { + map.put("attributeValue", attributevalue); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("ajaxSpider", "action", "addExcludedElement", map); + } + + /** + * Modifies an excluded element of a context. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse modifyExcludedElement( + String contextname, + String description, + String element, + String descriptionnew, + String xpath, + String text, + String attributename, + String attributevalue, + String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("description", description); + map.put("element", element); + if (descriptionnew != null) { + map.put("descriptionNew", descriptionnew); + } + if (xpath != null) { + map.put("xpath", xpath); + } + if (text != null) { + map.put("text", text); + } + if (attributename != null) { + map.put("attributeName", attributename); + } + if (attributevalue != null) { + map.put("attributeValue", attributevalue); + } + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("ajaxSpider", "action", "modifyExcludedElement", map); + } + + /** + * Removes an excluded element from a context. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeExcludedElement(String contextname, String description) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("contextName", contextname); + map.put("description", description); + return api.callApi("ajaxSpider", "action", "removeExcludedElement", map); + } + /** * Removes an allowed resource. * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java index 14953a9..fd2e405 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AlertFilter.java @@ -27,7 +27,7 @@ /** This file was automatically generated. */ @SuppressWarnings("javadoc") -public class AlertFilter { +public class AlertFilter extends org.zaproxy.clientapi.gen.deprecated.AlertFilterDeprecated { private final ClientApi api; @@ -54,40 +54,13 @@ public ApiResponse alertFilterList(String contextid) throws ClientApiException { public ApiResponse globalAlertFilterList() throws ClientApiException { return api.callApi("alertFilter", "view", "globalAlertFilterList", null); } - /** - * Adds a new alert filter for the context with the given ID. - * - *

This component is optional and therefore the API will only work if it is installed - */ - public ApiResponse addAlertFilter( - String contextid, - String ruleid, - String newlevel, - String url, - String urlisregex, - String parameter, - String enabled) - throws ClientApiException { - return addAlertFilter( - contextid, - ruleid, - newlevel, - url, - urlisregex, - parameter, - enabled, - null, - null, - null, - null, - null); - } /** * Adds a new alert filter for the context with the given ID. * *

This component is optional and therefore the API will only work if it is installed */ + @Override public ApiResponse addAlertFilter( String contextid, String ruleid, @@ -100,7 +73,8 @@ public ApiResponse addAlertFilter( String attack, String attackisregex, String evidence, - String evidenceisregex) + String evidenceisregex, + String methods) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); @@ -133,6 +107,9 @@ public ApiResponse addAlertFilter( if (evidenceisregex != null) { map.put("evidenceIsRegex", evidenceisregex); } + if (methods != null) { + map.put("methods", methods); + } return api.callApi("alertFilter", "action", "addAlertFilter", map); } @@ -141,35 +118,7 @@ public ApiResponse addAlertFilter( * *

This component is optional and therefore the API will only work if it is installed */ - public ApiResponse removeAlertFilter( - String contextid, - String ruleid, - String newlevel, - String url, - String urlisregex, - String parameter, - String enabled) - throws ClientApiException { - return removeAlertFilter( - contextid, - ruleid, - newlevel, - url, - urlisregex, - parameter, - enabled, - null, - null, - null, - null, - null); - } - - /** - * Removes an alert filter from the context with the given ID. - * - *

This component is optional and therefore the API will only work if it is installed - */ + @Override public ApiResponse removeAlertFilter( String contextid, String ruleid, @@ -182,7 +131,8 @@ public ApiResponse removeAlertFilter( String attack, String attackisregex, String evidence, - String evidenceisregex) + String evidenceisregex, + String methods) throws ClientApiException { Map map = new HashMap<>(); map.put("contextId", contextid); @@ -215,6 +165,9 @@ public ApiResponse removeAlertFilter( if (evidenceisregex != null) { map.put("evidenceIsRegex", evidenceisregex); } + if (methods != null) { + map.put("methods", methods); + } return api.callApi("alertFilter", "action", "removeAlertFilter", map); } @@ -223,6 +176,7 @@ public ApiResponse removeAlertFilter( * *

This component is optional and therefore the API will only work if it is installed */ + @Override public ApiResponse addGlobalAlertFilter( String ruleid, String newlevel, @@ -234,7 +188,8 @@ public ApiResponse addGlobalAlertFilter( String attack, String attackisregex, String evidence, - String evidenceisregex) + String evidenceisregex, + String methods) throws ClientApiException { Map map = new HashMap<>(); map.put("ruleId", ruleid); @@ -266,6 +221,9 @@ public ApiResponse addGlobalAlertFilter( if (evidenceisregex != null) { map.put("evidenceIsRegex", evidenceisregex); } + if (methods != null) { + map.put("methods", methods); + } return api.callApi("alertFilter", "action", "addGlobalAlertFilter", map); } @@ -274,6 +232,7 @@ public ApiResponse addGlobalAlertFilter( * *

This component is optional and therefore the API will only work if it is installed */ + @Override public ApiResponse removeGlobalAlertFilter( String ruleid, String newlevel, @@ -285,7 +244,8 @@ public ApiResponse removeGlobalAlertFilter( String attack, String attackisregex, String evidence, - String evidenceisregex) + String evidenceisregex, + String methods) throws ClientApiException { Map map = new HashMap<>(); map.put("ruleId", ruleid); @@ -317,6 +277,9 @@ public ApiResponse removeGlobalAlertFilter( if (evidenceisregex != null) { map.put("evidenceIsRegex", evidenceisregex); } + if (methods != null) { + map.put("methods", methods); + } return api.callApi("alertFilter", "action", "removeGlobalAlertFilter", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index ab0a189..0770a17 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -146,6 +146,8 @@ public ApiResponse optionDefaultPolicy() throws ClientApiException { return api.callApi("ascan", "view", "optionDefaultPolicy", null); } + /** @deprecated Option no longer in effective use. */ + @Deprecated public ApiResponse optionDelayInMs() throws ClientApiException { return api.callApi("ascan", "view", "optionDelayInMs", null); } @@ -158,6 +160,11 @@ public ApiResponse optionHostPerScan() throws ClientApiException { return api.callApi("ascan", "view", "optionHostPerScan", null); } + /** Gets the maximum number of alerts that a rule can raise before being skipped. */ + public ApiResponse optionMaxAlertsPerRule() throws ClientApiException { + return api.callApi("ascan", "view", "optionMaxAlertsPerRule", null); + } + public ApiResponse optionMaxChartTimeInMins() throws ClientApiException { return api.callApi("ascan", "view", "optionMaxChartTimeInMins", null); } @@ -204,7 +211,7 @@ public ApiResponse optionAllowAttackOnStart() throws ClientApiException { /** * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, - * with the ID of the scanner that's sending the requests. + * with the ID of the scan rule that's sending the requests. */ public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); @@ -576,7 +583,7 @@ public ApiResponse removeExcludedParam(String idx) throws ClientApiException { return api.callApi("ascan", "action", "removeExcludedParam", map); } - /** Skips the scanner using the given IDs of the scan and the scanner. */ + /** Skips the scan rule using the given IDs of the scan and the scan rule. */ public ApiResponse skipScanner(String scanid, String scannerid) throws ClientApiException { Map map = new HashMap<>(); map.put("scanId", scanid); @@ -612,6 +619,8 @@ public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiExc return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); } + /** @deprecated Option no longer in effective use. */ + @Deprecated public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); @@ -632,7 +641,7 @@ public ApiResponse setOptionHostPerScan(int i) throws ClientApiException { /** * Sets whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, - * with the ID of the scanner that's sending the requests. + * with the ID of the scan rule that's sending the requests. */ public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -640,6 +649,13 @@ public ApiResponse setOptionInjectPluginIdInHeader(boolean bool) throws ClientAp return api.callApi("ascan", "action", "setOptionInjectPluginIdInHeader", map); } + /** Sets the maximum number of alerts that a rule can raise before being skipped. */ + public ApiResponse setOptionMaxAlertsPerRule(int i) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Integer", Integer.toString(i)); + return api.callApi("ascan", "action", "setOptionMaxAlertsPerRule", map); + } + public ApiResponse setOptionMaxChartTimeInMins(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java index 35261ab..ed0a5d6 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Graphql.java @@ -89,6 +89,15 @@ public ApiResponse optionOptionalArgsEnabled() throws ClientApiException { return api.callApi("graphql", "view", "optionOptionalArgsEnabled", null); } + /** + * Returns whether the query generator is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionQueryGenEnabled() throws ClientApiException { + return api.callApi("graphql", "view", "optionQueryGenEnabled", null); + } + /** * Returns the current level for which a single query is generated. * @@ -221,4 +230,15 @@ public ApiResponse setOptionOptionalArgsEnabled(boolean bool) throws ClientApiEx map.put("Boolean", Boolean.toString(bool)); return api.callApi("graphql", "action", "setOptionOptionalArgsEnabled", map); } + + /** + * Sets whether the query generator is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionQueryGenEnabled(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("graphql", "action", "setOptionQueryGenEnabled", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java index 54fcbb3..141e8f9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Network.java @@ -171,6 +171,15 @@ public ApiResponse isUseGlobalHttpState() throws ClientApiException { return api.callApi("network", "view", "isUseGlobalHttpState", null); } + /** + * List of rate limit rules. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getRateLimitRules() throws ClientApiException { + return api.callApi("network", "view", "getRateLimitRules", null); + } + /** * Generates a new Root CA certificate, used to issue server certificates. * @@ -384,7 +393,7 @@ public ApiResponse addHttpProxyExclusion(String host, String enabled) } /** - * Removes a HTTP proxy exclusion. + * Removes an HTTP proxy exclusion. * *

This component is optional and therefore the API will only work if it is installed */ @@ -440,7 +449,7 @@ public ApiResponse setHttpProxyEnabled(String enabled) throws ClientApiException } /** - * Sets whether or not a HTTP proxy exclusion is enabled. + * Sets whether or not an HTTP proxy exclusion is enabled. * *

This component is optional and therefore the API will only work if it is installed */ @@ -533,6 +542,53 @@ public ApiResponse setUseClientCertificate(String use) throws ClientApiException return api.callApi("network", "action", "setUseClientCertificate", map); } + /** + * Adds a rate limit rule + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addRateLimitRule( + String description, + String enabled, + String matchregex, + String matchstring, + String requestspersecond, + String groupby) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("enabled", enabled); + map.put("matchRegex", matchregex); + map.put("matchString", matchstring); + map.put("requestsPerSecond", requestspersecond); + map.put("groupBy", groupby); + return api.callApi("network", "action", "addRateLimitRule", map); + } + + /** + * Remove a rate limit rule + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeRateLimitRule(String description) throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + return api.callApi("network", "action", "removeRateLimitRule", map); + } + + /** + * Set enabled state for a rate limit rule. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setRateLimitRuleEnabled(String description, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("description", description); + map.put("enabled", enabled); + return api.callApi("network", "action", "setRateLimitRuleEnabled", map); + } + /** * Provides a PAC file, proxying through the main proxy. * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index dd0b6e3..ac85056 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -117,8 +117,8 @@ public ApiResponse disableScanners(String ids) throws ClientApiException { } /** - * Sets the alert threshold of the passive scanner with the given ID, accepted values for alert - * threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH + * Sets the alert threshold of the passive scan rule with the given ID, accepted values for + * alert threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH */ public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) throws ClientApiException { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index de418fa..0bc98b0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -88,11 +88,8 @@ public ApiResponse optionLastDirectory() throws ClientApiException { return api.callApi("selenium", "view", "optionLastDirectory", null); } - /** - * Returns the current path to PhantomJS binary - * - *

This component is optional and therefore the API will only work if it is installed - */ + /** This component is optional and therefore the API will only work if it is installed */ + @Deprecated public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { return api.callApi("selenium", "view", "optionPhantomJsBinaryPath", null); } @@ -156,11 +153,8 @@ public ApiResponse setOptionLastDirectory(String string) throws ClientApiExcepti return api.callApi("selenium", "action", "setOptionLastDirectory", map); } - /** - * Sets the current path to PhantomJS binary - * - *

This component is optional and therefore the API will only work if it is installed - */ + /** This component is optional and therefore the API will only work if it is installed */ + @Deprecated public ApiResponse setOptionPhantomJsBinaryPath(String string) throws ClientApiException { Map map = new HashMap<>(); map.put("String", string); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index a87ac20..2138265 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -213,6 +213,11 @@ public ApiResponse optionParseComments() throws ClientApiException { return api.callApi("spider", "view", "optionParseComments", null); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionParseDsStore() throws ClientApiException { + return api.callApi("spider", "view", "optionParseDsStore", null); + } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseGit() throws ClientApiException { return api.callApi("spider", "view", "optionParseGit", null); @@ -558,6 +563,13 @@ public ApiResponse setOptionParseComments(boolean bool) throws ClientApiExceptio return api.callApi("spider", "action", "setOptionParseComments", map); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionParseDsStore(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionParseDsStore", map); + } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse setOptionParseGit(boolean bool) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AlertFilterDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AlertFilterDeprecated.java new file mode 100644 index 0000000..71a5e17 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/AlertFilterDeprecated.java @@ -0,0 +1,304 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2023 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen.deprecated; + +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApiException; + +/** API implementation with deprecated methods, (re)moved from generated class. */ +@SuppressWarnings("javadoc") +public abstract class AlertFilterDeprecated { + + /** + * Adds a new alert filter for the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled) + throws ClientApiException { + return addAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + null, + null, + null, + null, + null); + } + + /** + * Adds a new alert filter for the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + return addAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + parameterisregex, + attack, + attackisregex, + evidence, + evidenceisregex, + null); + } + + /** + * Adds a new alert filter for the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public abstract ApiResponse addAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex, + String methods) + throws ClientApiException; + + /** + * Adds a new global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + return addGlobalAlertFilter( + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + parameterisregex, + attack, + attackisregex, + evidence, + evidenceisregex, + null); + } + + /** + * Adds a new global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public abstract ApiResponse addGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex, + String methods) + throws ClientApiException; + + /** + * Removes an alert filter from the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled) + throws ClientApiException { + return removeAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + null, + null, + null, + null, + null); + } + + /** + * Removes an alert filter from the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + return removeAlertFilter( + contextid, + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + parameterisregex, + attack, + attackisregex, + evidence, + evidenceisregex, + null); + } + + /** + * Removes an alert filter from the context with the given ID. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public abstract ApiResponse removeAlertFilter( + String contextid, + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex, + String methods) + throws ClientApiException; + + /** + * Removes a global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex) + throws ClientApiException { + return removeGlobalAlertFilter( + ruleid, + newlevel, + url, + urlisregex, + parameter, + enabled, + parameterisregex, + attack, + attackisregex, + evidence, + evidenceisregex, + null); + } + + /** + * Removes a global alert filter. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public abstract ApiResponse removeGlobalAlertFilter( + String ruleid, + String newlevel, + String url, + String urlisregex, + String parameter, + String enabled, + String parameterisregex, + String attack, + String attackisregex, + String evidence, + String evidenceisregex, + String methods) + throws ClientApiException; +} From 04d9be54b71bce0380730f5d02ae404e19793f6b Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 14 Jul 2023 14:06:47 +0100 Subject: [PATCH 109/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 002bf9a..856873b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.12.0] - 2023-07-13 ### Changed - Minimum Java version is now 11. @@ -174,6 +176,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...HEAD [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 diff --git a/build.gradle b/build.gradle index 746f89f..fc5c98b 100644 --- a/build.gradle +++ b/build.gradle @@ -12,8 +12,8 @@ subprojects { group = 'org.zaproxy' - version '1.12.0' - ext.versionBC = '1.11.0' + version '1.13.0-SNAPSHOT' + ext.versionBC = '1.12.0' repositories { mavenCentral() From c46ffc21ec8022349ce5448f455cc861987001c9 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 24 Jul 2023 21:32:43 +0100 Subject: [PATCH 110/148] Update Gradle and plugins Update Gradle Wrapper to 8.2.1 and plugins. Use Kotlin DSL for settings and main build file. Address deprecations with newer Java versions. Apply new formatting, required for newer Java versions. Signed-off-by: thc202 --- build.gradle | 44 --------- build.gradle.kts | 58 +++++++++++ gradle/compile.gradle | 10 -- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 16 +-- settings.gradle | 12 --- settings.gradle.kts | 16 +++ .../org/zaproxy/clientapi/ant/AlertTask.java | 7 +- .../org/zaproxy/clientapi/ant/ReportTask.java | 2 +- .../org/zaproxy/clientapi/core/Alert.java | 6 ++ .../org/zaproxy/clientapi/core/ClientApi.java | 21 ++-- .../java/org/zaproxy/clientapi/gen/Ascan.java | 8 +- .../java/org/zaproxy/clientapi/gen/Core.java | 92 +++++++++++++----- .../gen/deprecated/ReplacerDeprecated.java | 4 +- .../gen/deprecated/SpiderDeprecated.java | 8 +- .../zap-clientapi/zap-clientapi.gradle | 13 ++- 17 files changed, 207 insertions(+), 115 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 gradle/compile.gradle delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/build.gradle b/build.gradle deleted file mode 100644 index fc5c98b..0000000 --- a/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id "com.diffplug.spotless" version "6.14.1" - id "net.ltgt.errorprone" version "3.0.1" -} - -apply from: "gradle/compile.gradle" - -subprojects { - apply plugin: 'java-library' - apply plugin: 'com.diffplug.spotless' - apply plugin: "net.ltgt.errorprone" - - group = 'org.zaproxy' - - version '1.13.0-SNAPSHOT' - ext.versionBC = '1.12.0' - - repositories { - mavenCentral() - } - - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - - spotless { - java { - licenseHeaderFile "$rootDir/gradle/spotless/license.java" - - googleJavaFormat("1.7").style('AOSP') - } - } - - dependencies { - errorprone 'com.google.errorprone:error_prone_core:2.18.0' - } - - tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" - options.compilerArgs = ["-Xlint:all", "-Xlint:-path", "-Xlint:-options", "-Werror"] - options.errorprone { - disable("EmptyBlockTag", "InlineMeSuggester") - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..455771d --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,58 @@ +import net.ltgt.gradle.errorprone.errorprone + +plugins { + id("com.diffplug.spotless") version "6.20.0" + id("net.ltgt.errorprone") version "3.1.0" +} + +subprojects { + apply(plugin = "java-library") + apply(plugin = "com.diffplug.spotless") + apply(plugin = "net.ltgt.errorprone") + + group = "org.zaproxy" + + version = "1.13.0-SNAPSHOT" + extra["versionBC"] = "1.12.0" + + repositories { + mavenCentral() + } + + java { + val javaVersion = JavaVersion.VERSION_11 + sourceCompatibility = javaVersion + targetCompatibility = javaVersion + } + + spotless { + java { + licenseHeaderFile("$rootDir/gradle/spotless/license.java") + + googleJavaFormat("1.17.0").aosp() + } + + kotlin { + ktlint() + } + + kotlinGradle { + ktlint() + } + } + + dependencies { + "errorprone"("com.google.errorprone:error_prone_core:2.20.0") + } + + tasks.withType { + options.encoding = "utf-8" + options.compilerArgs = listOf("-Xlint:all", "-Werror") + options.errorprone { + disable("EmptyBlockTag", "InlineMeSuggester") + } + } +} + +fun Project.java(configure: JavaPluginExtension.() -> Unit): Unit = + (this as ExtensionAware).extensions.configure("java", configure) diff --git a/gradle/compile.gradle b/gradle/compile.gradle deleted file mode 100644 index 8114f95..0000000 --- a/gradle/compile.gradle +++ /dev/null @@ -1,10 +0,0 @@ -allprojects { - tasks.withType(JavaCompile) { - options.encoding = 'utf-8' - options.compilerArgs = [ - '-Xlint:all', - '-Xlint:-options', - '-Werror' - ] - } -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 26632 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 delta 24877 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bc073f6..a6f7c3a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=312eb12875e1747e05c2f81a4789902d7e4ec5defbd1eefeaccc08acf096505d -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +distributionSha256Sum=7c3ad722e9b0ce8205b91560fd6ce8296ac3eadf065672242fd73c06b8eeb6ee +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68..fcb6fca 100755 --- a/gradlew +++ b/gradlew @@ -85,9 +85,6 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index fd11ff4..0000000 --- a/settings.gradle +++ /dev/null @@ -1,12 +0,0 @@ -include 'zap-clientapi' -include 'zap-clientapi-ant' - -rootProject.name = 'zap-api-java' -rootProject.children.each {project -> - String fileBaseName = project.name.replaceAll("\\p{Upper}") { "-${it.toLowerCase()}" } - String projectDirName = "subprojects/$fileBaseName" - project.projectDir = new File(settingsDir, projectDirName) - project.buildFileName = "${fileBaseName}.gradle" - assert project.projectDir.isDirectory() - assert project.buildFile.isFile() -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..77f9123 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,16 @@ +include("zap-clientapi") +include("zap-clientapi-ant") + +rootProject.name = "zap-api-java" + +rootProject.children.forEach { project -> + project.projectDir = File("$settingsDir/subprojects/", project.name) + project.buildFileName = "${project.name}.gradle" + + if (!project.projectDir.isDirectory) { + throw AssertionError("Project ${project.name} has no directory: ${project.projectDir}") + } + if (!project.buildFile.isFile) { + throw AssertionError("Project ${project.name} has no build file: ${project.buildFile}") + } +} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java index 92fa232..575eb42 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java @@ -24,7 +24,10 @@ public class AlertTask extends Task { private String name; private String risk; - /** @deprecated Use of reliability has been deprecated in favour of using confidence */ + + /** + * @deprecated Use of reliability has been deprecated in favour of using confidence + */ @Deprecated private String reliability; private String confidence; @@ -81,6 +84,7 @@ public String getRisk() { public void setRisk(String risk) { this.risk = risk; } + /** * @deprecated (2.4.0) {@link #getConfidence()}. Use of reliability has been deprecated in * favour of using confidence. @@ -89,6 +93,7 @@ public void setRisk(String risk) { public String getReliability() { return reliability; } + /** * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} Use of reliability has been * deprecated in favour of using confidence diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java index a4ee965..928d49a 100644 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java +++ b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java @@ -64,7 +64,7 @@ public void execute() throws BuildException { byte[] reportContents; try { - switch (type.toLowerCase()) { + switch (type.toLowerCase(Locale.ROOT)) { case MD_REPORT_TYPE: reportContents = this.getClientApi().core.mdreport(); break; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java index e781ff3..f9a585b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/Alert.java @@ -27,6 +27,7 @@ public enum Risk { Medium, High } + /** * @deprecated (2.4.0) Replaced by {@link Confidence}. Use of reliability has been deprecated in * favour of using confidence. @@ -48,6 +49,7 @@ public enum Confidence { private String id; private String name; private Risk risk; + /** * @deprecated (2.4.0) Replaced by {@link Confidence}. Use of reliability has been deprecated in * favour of using confidence @@ -285,6 +287,7 @@ public void setName(String name) { public String getAlert() { return name; } + /** * Sets the name of the alert. * @@ -307,6 +310,7 @@ public void setRisk(Risk risk) { public void setRisk(String risk) { this.risk = Risk.valueOf(risk); } + /** * @deprecated {@link #getConfidence()} Use of reliability has been deprecated in favour of * using confidence @@ -315,6 +319,7 @@ public void setRisk(String risk) { public Reliability getReliability() { return reliability; } + /** * @deprecated {@link #setConfidence(Confidence)} Use of reliability has been deprecated in * favour of using confidence @@ -323,6 +328,7 @@ public Reliability getReliability() { public void setReliability(Reliability reliability) { this.reliability = reliability; } + /** * @deprecated {@link #setConfidence(String)} Use of reliability has been deprecated in favour * of using confidence diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 7c7875d..eb4f553 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -33,6 +33,8 @@ import java.net.Proxy; import java.net.Socket; import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -214,7 +216,7 @@ private int statusToInt(ApiResponse response) { public void checkAlerts(List ignoreAlerts, List requireAlerts) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + Map> results = checkForAlerts(ignoreAlerts, requireAlerts); verifyAlerts(results.get("requireAlerts"), results.get("reportAlerts")); } @@ -250,7 +252,7 @@ private void verifyAlerts(List requireAlerts, List reportAlerts) public void checkAlerts(List ignoreAlerts, List requireAlerts, File outputFile) throws ClientApiException { - HashMap> results = checkForAlerts(ignoreAlerts, requireAlerts); + Map> results = checkForAlerts(ignoreAlerts, requireAlerts); int alertsFound = results.get("reportAlerts").size(); int alertsNotFound = results.get("requireAlerts").size(); int alertsIgnored = results.get("ignoredAlerts").size(); @@ -289,7 +291,7 @@ public List getAlerts(String baseUrl, int start, int count) throws Client return alerts; } - private HashMap> checkForAlerts( + private Map> checkForAlerts( List ignoreAlerts, List requireAlerts) throws ClientApiException { List reportAlerts = new ArrayList<>(); List ignoredAlerts = new ArrayList<>(); @@ -334,7 +336,7 @@ private HashMap> checkForAlerts( private void accessUrlViaProxy(Proxy proxy, String apiurl) throws ClientApiException { try { - URL url = new URL(apiurl); + URL url = createUrl(apiurl); if (debug) { debugStream.println("Open URL: " + apiurl); } @@ -363,6 +365,10 @@ private void accessUrlViaProxy(Proxy proxy, String apiurl) throws ClientApiExcep } } + private static URL createUrl(String value) throws MalformedURLException, URISyntaxException { + return new URI(value).toURL(); + } + public ApiResponse callApi( String component, String type, String method, Map params) throws ClientApiException { @@ -461,10 +467,11 @@ public byte[] callApiOther( * @param params the parameters for the endpoint. * @return the API request. * @throws MalformedURLException if an error occurred while building the URL. + * @throws URISyntaxException if an error occurred while building the URL. */ private HttpRequest buildZapRequest( String format, String component, String type, String method, Map params) - throws MalformedURLException { + throws MalformedURLException, URISyntaxException { StringBuilder sb = new StringBuilder(); sb.append("http://zap/"); sb.append(format); @@ -498,7 +505,7 @@ private HttpRequest buildZapRequest( sb.append(encodeQueryParam(apiKey)); } - HttpRequest request = new HttpRequest(new URL(sb.toString())); + HttpRequest request = new HttpRequest(createUrl(sb.toString())); if (apiKey != null && !apiKey.isEmpty()) { request.addHeader(ZAP_API_KEY_HEADER, apiKey); } @@ -613,7 +620,7 @@ private List getSessionUrls() throws Exception { ApiResponseElement urlList = (ApiResponseElement) ((ApiResponseList) response).getItems().get(0); for (ApiResponse element : ((ApiResponseList) response).getItems()) { - URL url = new URL(((ApiResponseElement) element).getValue()); + URL url = createUrl(((ApiResponseElement) element).getValue()); sessionUrls.add(url.getProtocol() + "://" + url.getHost() + url.getPath()); } System.out.println(urlList); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index 0770a17..2e2c341 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -146,7 +146,9 @@ public ApiResponse optionDefaultPolicy() throws ClientApiException { return api.callApi("ascan", "view", "optionDefaultPolicy", null); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse optionDelayInMs() throws ClientApiException { return api.callApi("ascan", "view", "optionDelayInMs", null); @@ -619,7 +621,9 @@ public ApiResponse setOptionAllowAttackOnStart(boolean bool) throws ClientApiExc return api.callApi("ascan", "action", "setOptionAllowAttackOnStart", map); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 9a466f2..bd9dc20 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -160,7 +160,9 @@ public ApiResponse optionAlertOverridesFilePath() throws ClientApiException { return api.callApi("core", "view", "optionAlertOverridesFilePath", null); } - /** @deprecated */ + /** + * @deprecated + */ @Deprecated public ApiResponse homeDirectory() throws ClientApiException { return api.callApi("core", "view", "homeDirectory", null); @@ -286,55 +288,73 @@ public ApiResponse optionDnsTtlSuccessfulQueries() throws ClientApiException { return api.callApi("core", "view", "optionDnsTtlSuccessfulQueries", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionHttpState() throws ClientApiException { return api.callApi("core", "view", "optionHttpState", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionHttpStateEnabled() throws ClientApiException { return api.callApi("core", "view", "optionHttpStateEnabled", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainName", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainPassword() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainPassword", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainPort() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainPort", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainPrompt() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainPrompt", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainRealm() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainRealm", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionProxyChainUserName() throws ClientApiException { return api.callApi("core", "view", "optionProxyChainUserName", null); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse optionSingleCookieRequestHeader() throws ClientApiException { return api.callApi("core", "view", "optionSingleCookieRequestHeader", null); @@ -350,13 +370,17 @@ public ApiResponse optionTimeoutInSecs() throws ClientApiException { return api.callApi("core", "view", "optionTimeoutInSecs", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionUseProxyChain() throws ClientApiException { return api.callApi("core", "view", "optionUseProxyChain", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse optionUseProxyChainAuth() throws ClientApiException { return api.callApi("core", "view", "optionUseProxyChainAuth", null); @@ -695,7 +719,9 @@ public ApiResponse setOptionDnsTtlSuccessfulQueries(int i) throws ClientApiExcep return api.callApi("core", "action", "setOptionDnsTtlSuccessfulQueries", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -703,7 +729,9 @@ public ApiResponse setOptionHttpStateEnabled(boolean bool) throws ClientApiExcep return api.callApi("core", "action", "setOptionHttpStateEnabled", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainName(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -711,7 +739,9 @@ public ApiResponse setOptionProxyChainName(String string) throws ClientApiExcept return api.callApi("core", "action", "setOptionProxyChainName", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -719,7 +749,9 @@ public ApiResponse setOptionProxyChainPassword(String string) throws ClientApiEx return api.callApi("core", "action", "setOptionProxyChainPassword", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { Map map = new HashMap<>(); @@ -727,7 +759,9 @@ public ApiResponse setOptionProxyChainPort(int i) throws ClientApiException { return api.callApi("core", "action", "setOptionProxyChainPort", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -735,7 +769,9 @@ public ApiResponse setOptionProxyChainPrompt(boolean bool) throws ClientApiExcep return api.callApi("core", "action", "setOptionProxyChainPrompt", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainRealm(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -755,7 +791,9 @@ public ApiResponse setOptionProxyChainSkipName(String string) throws ClientApiEx return api.callApi("core", "action", "setOptionProxyChainSkipName", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiException { Map map = new HashMap<>(); @@ -763,7 +801,9 @@ public ApiResponse setOptionProxyChainUserName(String string) throws ClientApiEx return api.callApi("core", "action", "setOptionProxyChainUserName", map); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse setOptionSingleCookieRequestHeader(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -796,7 +836,9 @@ public ApiResponse setOptionUseProxyChain(boolean bool) throws ClientApiExceptio return api.callApi("core", "action", "setOptionUseProxyChain", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public ApiResponse setOptionUseProxyChainAuth(boolean bool) throws ClientApiException { Map map = new HashMap<>(); @@ -816,7 +858,9 @@ public ApiResponse setOptionUseSocksProxy(boolean bool) throws ClientApiExceptio return api.callApi("core", "action", "setOptionUseSocksProxy", map); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public byte[] proxypac() throws ClientApiException { return api.callApiOther("core", "other", "proxy.pac", null); @@ -832,7 +876,9 @@ public byte[] rootcert() throws ClientApiException { return api.callApiOther("core", "other", "rootcert", null); } - /** @deprecated Use the API endpoints in the 'network' component instead. */ + /** + * @deprecated Use the API endpoints in the 'network' component instead. + */ @Deprecated public byte[] setproxy(String proxy) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java index 68b48a8..32a41dc 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/ReplacerDeprecated.java @@ -35,7 +35,9 @@ public ReplacerDeprecated(ClientApi api) { this.api = api; } - /** @deprecated (1.11.0) Use the method with the url. */ + /** + * @deprecated (1.11.0) Use the method with the url. + */ @Deprecated public ApiResponse addRule( String description, diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java index cd994ae..12fdb40 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/SpiderDeprecated.java @@ -549,13 +549,17 @@ public ApiResponse setOptionThreadCount(String apikey, int i) throws ClientApiEx return api.callApi("spider", "action", "setOptionThreadCount", map); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse optionScope() throws ClientApiException { return api.callApi("spider", "view", "optionScope", null); } - /** @deprecated Option no longer in effective use. */ + /** + * @deprecated Option no longer in effective use. + */ @Deprecated public ApiResponse optionScopeText() throws ClientApiException { return api.callApi("spider", "view", "optionScopeText", null); diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 16dd18c..4dd8d98 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -42,23 +42,28 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." oldClasspath.from(files(clientapiJar(versionBC))) - newClasspath.from(files(tasks.named(JavaPlugin.JAR_TASK_NAME).map { it.archivePath })) + newClasspath.from(tasks.named(JavaPlugin.JAR_TASK_NAME)) onlyBinaryIncompatibleModified.set(true) failOnModification.set(true) ignoreMissingClasses.set(true) - htmlOutputFile.set(file("$buildDir/reports/japi.html")) + + richReport { + destinationDir.set(file("$buildDir/reports/")) + reportName.set("japi.html") + addDefaultRules.set(true) + } } check.dependsOn(japicmp) task javadocJar(type: Jar) { - classifier = 'javadoc' + archiveClassifier = 'javadoc' from javadoc } task sourcesJar(type: Jar) { from sourceSets.main.allJava - classifier "sources" + archiveClassifier = "sources" } task uberJar(type: Jar) { From 836ec8994a2879b76940b96d841edf132ac027fe Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 1 Aug 2023 16:13:33 +0100 Subject: [PATCH 111/148] Update docs and POM Remove OWASP references. Signed-off-by: thc202 --- README.md | 14 +++++++------- .../zap-clientapi-ant/zap-clientapi-ant.gradle | 2 +- subprojects/zap-clientapi/zap-clientapi.gradle | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8ca2813..572c3c2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -# OWASP ZAP Java API +# ZAP Java API [![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) -The Java implementation to access the [OWASP ZAP API](https://www.zaproxy.org/docs/api/). For more information -about OWASP ZAP consult the (main) [OWASP ZAP project](https://github.com/zaproxy/zaproxy/). +The Java implementation to access the [ZAP API](https://www.zaproxy.org/docs/api/). For more information +about ZAP consult the (main) [ZAP project](https://github.com/zaproxy/zaproxy/). This project produces two libraries: - * `zap-clientapi`, the library that contains the Java implementation to access the OWASP ZAP API; + * `zap-clientapi`, the library that contains the Java implementation to access the ZAP API; * `zap-clientapi-ant`, the library that contains [Ant](https://ant.apache.org/) tasks that wrap functionality provided by `zap-clientapi`. This library depends on `zap-clientapi` and Ant, both should be available at runtime. @@ -27,14 +27,14 @@ Previous releases are also available, more details can be found in [Maven Centra ## Getting Help -For help using OWASP ZAP API refer to: +For help using ZAP API refer to: * [Examples](subprojects/zap-clientapi/src/examples/java/org/zaproxy/clientapi/examples) - collection of examples using the library; * [API Documentation](https://www.zaproxy.org/docs/api/) - * [OWASP ZAP User Group](https://groups.google.com/group/zaproxy-users) - for asking questions + * [ZAP User Group](https://groups.google.com/group/zaproxy-users) - for asking questions ## Issues -To report issues related to OWASP ZAP API, bugs and enhancements requests, use the [issue tracker of the main OWASP ZAP project](https://github.com/zaproxy/zaproxy/issues). +To report issues related to ZAP API, bugs and enhancements requests, use the [issue tracker of the main ZAP project](https://github.com/zaproxy/zaproxy/issues). ## Building diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle index af98c95..96c8f55 100644 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle @@ -9,7 +9,7 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'OWASP ZAP Ant API Client', + attributes 'Implementation-Title': 'ZAP Ant API Client', 'Implementation-Version': archiveVersion.get(), 'Create-Date': new Date().format("yyyy-MM-dd") } diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 4dd8d98..fb9845c 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -17,7 +17,7 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'OWASP ZAP API Client', + attributes 'Implementation-Title': 'ZAP API Client', 'Implementation-Version': archiveVersion.get(), 'Main-Class': 'org.zaproxy.clientapi.core.ClientApiMain', 'Create-Date': new Date().format("yyyy-MM-dd") @@ -107,23 +107,23 @@ publishing { artifact javadocJar pom { - name = 'OWASP ZAP API Client' - description = 'Java implementation to access OWASP ZAP API.' + name = 'ZAP API Client' + description = 'Java implementation to access ZAP API.' url = 'https://github.com/zaproxy/zap-api-java' organization { - name = 'OWASP' + name = 'ZAP' url = 'https://www.zaproxy.org/' } mailingLists { mailingList { - name = 'OWASP ZAP User Group' + name = 'ZAP User Group' post = 'zaproxy-users@googlegroups.com' archive = 'https://groups.google.com/group/zaproxy-users' } mailingList { - name = 'OWASP ZAP Developer Group' + name = 'ZAP Developer Group' post = 'zaproxy-develop@googlegroups.com' archive = 'https://groups.google.com/group/zaproxy-develop' } From 7075e03e4186e69e1574c075daa3ef34cc5e49de Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 24 Oct 2023 13:48:59 +0100 Subject: [PATCH 112/148] Remove Ant tasks The Ant tasks have low usage, there was also no feedback to the deprecation announcement: https://groups.google.com/g/zaproxy-users/c/sDXv9deeS_Y/m/i8j-MdlQBAAJ Signed-off-by: thc202 --- README.md | 5 +- RELEASING.md | 1 - settings.gradle.kts | 1 - .../clientapi/ant/AbstractActiveScanTask.java | 56 ----- .../zaproxy/clientapi/ant/AccessUrlTask.java | 45 ---- .../clientapi/ant/ActiveScanSubtreeTask.java | 31 --- .../clientapi/ant/ActiveScanUrlTask.java | 31 --- .../zaproxy/clientapi/ant/AlertCheckTask.java | 80 ------- .../org/zaproxy/clientapi/ant/AlertTask.java | 137 ------------ .../clientapi/ant/LoadSessionTask.java | 45 ---- .../zaproxy/clientapi/ant/NewSessionTask.java | 45 ---- .../org/zaproxy/clientapi/ant/ReportTask.java | 138 ------------ .../clientapi/ant/SaveSessionTask.java | 45 ---- .../zaproxy/clientapi/ant/SpiderUrlTask.java | 52 ----- .../zaproxy/clientapi/ant/StopZapTask.java | 34 --- .../org/zaproxy/clientapi/ant/ZapTask.java | 75 ------- .../org/zaproxy/clientapi/ant/BuildTest.java | 208 ------------------ .../org/zaproxy/clientapi/ant/build.xml | 67 ------ .../zap-clientapi-ant.gradle | 16 -- 19 files changed, 1 insertion(+), 1111 deletions(-) delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java delete mode 100644 subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java delete mode 100644 subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml delete mode 100644 subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle diff --git a/README.md b/README.md index 572c3c2..0e7482e 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,7 @@ The Java implementation to access the [ZAP API](https://www.zaproxy.org/docs/api/). For more information about ZAP consult the (main) [ZAP project](https://github.com/zaproxy/zaproxy/). -This project produces two libraries: - * `zap-clientapi`, the library that contains the Java implementation to access the ZAP API; - * `zap-clientapi-ant`, the library that contains [Ant](https://ant.apache.org/) tasks that wrap functionality - provided by `zap-clientapi`. This library depends on `zap-clientapi` and Ant, both should be available at runtime. +This project produces the library `zap-clientapi`, which contains the Java implementation to access the ZAP API. ## How to Obtain diff --git a/RELEASING.md b/RELEASING.md index 6a1784e..42a13fe 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -79,5 +79,4 @@ Release in GitHub: 2. Upload the libraries: - `zap-api-.jar` - `zap-clientapi-.jar` - - `zap-clientapi-ant-.jar` 3. Publish release. diff --git a/settings.gradle.kts b/settings.gradle.kts index 77f9123..9efb113 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,4 @@ include("zap-clientapi") -include("zap-clientapi-ant") rootProject.name = "zap-api-java" diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java deleted file mode 100644 index ee8d00a..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AbstractActiveScanTask.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2017 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ClientApiException; - -public abstract class AbstractActiveScanTask extends ZapTask { - - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Override - public void execute() throws BuildException { - try { - waitForActiveScan(extractValue(startScan())); - } catch (Exception e) { - throw new BuildException(e); - } - } - - protected abstract ApiResponse startScan() throws ClientApiException; - - private void waitForActiveScan(String scanId) throws ClientApiException, InterruptedException { - int progress; - do { - progress = Integer.parseInt(extractValue(getClientApi().ascan.status(scanId))); - Thread.sleep(1000); - } while (progress < 100); - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java deleted file mode 100644 index 3ff8d9b..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AccessUrlTask.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class AccessUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().accessUrl(url); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java deleted file mode 100644 index 62e1b30..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanSubtreeTask.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ClientApiException; - -public class ActiveScanSubtreeTask extends AbstractActiveScanTask { - - @Override - protected ApiResponse startScan() throws ClientApiException { - return this.getClientApi().ascan.scan(getUrl(), "true", "false", "", "", ""); - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java deleted file mode 100644 index c5fba37..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ActiveScanUrlTask.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ClientApiException; - -public class ActiveScanUrlTask extends AbstractActiveScanTask { - - @Override - protected ApiResponse startScan() throws ClientApiException { - return this.getClientApi().ascan.scan(getUrl(), "false", "false", "", "", ""); - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java deleted file mode 100644 index 627015a..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertCheckTask.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import java.util.ArrayList; -import java.util.List; -import org.apache.tools.ant.BuildException; -import org.zaproxy.clientapi.core.Alert; - -public class AlertCheckTask extends ZapTask { - - private List ignoreAlertTasks = new ArrayList<>(); - private List requireAlertTasks = new ArrayList<>(); - - @Override - public void execute() throws BuildException { - try { - List ignoreAlerts = new ArrayList<>(ignoreAlertTasks.size()); - List requireAlerts = new ArrayList<>(requireAlertTasks.size()); - for (AlertTask alert : ignoreAlertTasks) { - ignoreAlerts.add( - new Alert( - alert.getName(), - alert.getUrl(), - alert.getRisk(), - alert.getConfidence(), - alert.getParam(), - alert.getOther())); - } - for (AlertTask alert : requireAlertTasks) { - requireAlerts.add( - new Alert( - alert.getName(), - alert.getUrl(), - alert.getRisk(), - alert.getConfidence(), - alert.getParam(), - alert.getOther())); - } - - this.getClientApi().checkAlerts(ignoreAlerts, requireAlerts); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public void addIgnoreAlert(AlertTask alert) { - this.ignoreAlertTasks.add(alert); - } - - public void addRequireAlert(AlertTask alert) { - this.requireAlertTasks.add(alert); - } - - public List getIgnoreAlerts() { - return ignoreAlertTasks; - } - - public List getRequireAlerts() { - return requireAlertTasks; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java deleted file mode 100644 index 575eb42..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/AlertTask.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.Task; - -public class AlertTask extends Task { - private String name; - private String risk; - - /** - * @deprecated Use of reliability has been deprecated in favour of using confidence - */ - @Deprecated private String reliability; - - private String confidence; - private String url; - private String other; - private String param; - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @since 1.1.0 - */ - public String getName() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @since 1.1.0 - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the name of the alert. - * - * @return the name of the alert - * @deprecated (1.1.0) Use {@link #getName()} instead. - */ - @Deprecated - public String getAlert() { - return name; - } - - /** - * Sets the name of the alert. - * - * @param name the name of the alert - * @deprecated (1.1.0) Use {@link #setName(String)} instead. - */ - @Deprecated - public void setAlert(String name) { - this.name = name; - } - - public String getRisk() { - return risk; - } - - public void setRisk(String risk) { - this.risk = risk; - } - - /** - * @deprecated (2.4.0) {@link #getConfidence()}. Use of reliability has been deprecated in - * favour of using confidence. - */ - @Deprecated - public String getReliability() { - return reliability; - } - - /** - * @deprecated (2.4.0) Replaced by {@link #setConfidence(String)} Use of reliability has been - * deprecated in favour of using confidence - */ - @Deprecated - public void setReliability(String reliability) { - this.reliability = reliability; - } - - public String getConfidence() { - return confidence; - } - - public void setConfidence(String confidence) { - this.confidence = confidence; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getOther() { - return other; - } - - public void setOther(String other) { - this.other = other; - } - - public String getParam() { - return param; - } - - public void setParam(String param) { - this.param = param; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java deleted file mode 100644 index acf6119..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/LoadSessionTask.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class LoadSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.loadSession(name); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java deleted file mode 100644 index 0172fbc..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/NewSessionTask.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class NewSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.newSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java deleted file mode 100644 index 928d49a..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ReportTask.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2017 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.Files; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import org.apache.tools.ant.BuildException; - -public class ReportTask extends ZapTask { - - private static final String HTML_REPORT_TYPE = "html"; - private static final String MD_REPORT_TYPE = "md"; - private static final String XML_REPORT_TYPE = "xml"; - private static final String DEFAULT_REPORT_TYPE = HTML_REPORT_TYPE; - - private static final List SUPPORTED_REPORT_TYPES = - Arrays.asList(HTML_REPORT_TYPE, MD_REPORT_TYPE, XML_REPORT_TYPE); - - private String type = DEFAULT_REPORT_TYPE; - private File file; - private boolean overwrite; - - public void setType(String type) { - this.type = type; - } - - public void setFile(String file) { - this.file = new File(file); - if (!this.file.isAbsolute()) { - this.file = new File(getProject().getBaseDir(), file); - } - } - - public void setOverwrite(boolean overwrite) { - this.overwrite = overwrite; - } - - @Override - @SuppressWarnings("deprecation") - public void execute() throws BuildException { - validateTaskAttributes(); - - byte[] reportContents; - try { - switch (type.toLowerCase(Locale.ROOT)) { - case MD_REPORT_TYPE: - reportContents = this.getClientApi().core.mdreport(); - break; - case XML_REPORT_TYPE: - reportContents = this.getClientApi().core.xmlreport(); - break; - case HTML_REPORT_TYPE: - default: - reportContents = this.getClientApi().core.htmlreport(); - break; - } - } catch (Exception e) { - throw new BuildException("Failed to obtain the report from ZAP: " + e.getMessage(), e); - } - - try (OutputStream os = Files.newOutputStream(file.toPath())) { - os.write(reportContents); - } catch (IOException e) { - throw new BuildException("Failed to save the report: " + e.getMessage(), e); - } - } - - private void validateTaskAttributes() { - if (type == null || type.isEmpty()) { - type = DEFAULT_REPORT_TYPE; - } else { - type = type.toLowerCase(Locale.ROOT); - if (!SUPPORTED_REPORT_TYPES.contains(type)) { - throw new BuildException( - "Unknown report type [" - + type - + "], supported types: " - + SUPPORTED_REPORT_TYPES); - } - } - - if (file == null) { - throw new BuildException("The 'file' attribute must be provided."); - } - - if (file.isFile()) { - if (!file.canWrite()) { - throw new BuildException( - "The provided file is not writable: " + file.getAbsolutePath()); - } - - if (!overwrite) { - throw new BuildException( - "The file already exists but 'overwrite' attribute is not set to 'true': " - + file.getAbsolutePath()); - } - } else if (!file.exists()) { - File dir = file.getParentFile(); - if (dir == null) { - throw new BuildException( - "Unable to determine parent directory of the file provided: " - + file.getAbsolutePath()); - } - - dir.mkdirs(); - if (!dir.canWrite()) { - throw new BuildException( - "The provided directory does not exist or is not writable: " - + dir.getAbsolutePath()); - } - } else { - throw new BuildException( - "The 'file' attribute does not specify a file: " + file.getAbsolutePath()); - } - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java deleted file mode 100644 index 4e56e0f..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SaveSessionTask.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class SaveSessionTask extends ZapTask { - - private String name; - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.saveSession(name, "true"); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java deleted file mode 100644 index 31c260f..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/SpiderUrlTask.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class SpiderUrlTask extends ZapTask { - - private String url; - - @Override - public void execute() throws BuildException { - try { - String scanId = extractValue(this.getClientApi().spider.scan(url, "", "", null, null)); - - int progress; - do { - progress = - Integer.parseInt(extractValue(this.getClientApi().spider.status(scanId))); - Thread.sleep(1000); - } while (progress < 100); - - } catch (Exception e) { - throw new BuildException(e); - } - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java deleted file mode 100644 index fa69f85..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/StopZapTask.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.BuildException; - -public class StopZapTask extends ZapTask { - - @Override - public void execute() throws BuildException { - try { - this.getClientApi().core.shutdown(); - } catch (Exception e) { - throw new BuildException(e); - } - } -} diff --git a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java b/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java deleted file mode 100644 index 4dc8da0..0000000 --- a/subprojects/zap-clientapi-ant/src/main/java/org/zaproxy/clientapi/ant/ZapTask.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2011 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import org.apache.tools.ant.Task; -import org.zaproxy.clientapi.core.ApiResponse; -import org.zaproxy.clientapi.core.ApiResponseElement; -import org.zaproxy.clientapi.core.ClientApi; - -public abstract class ZapTask extends Task { - private String zapAddress; - private int zapPort; - private boolean debug = false; - private String apikey; - - protected ClientApi getClientApi() { - return new ClientApi(zapAddress, zapPort, apikey, debug); - } - - public String getZapAddress() { - return zapAddress; - } - - public void setZapAddress(String zapAddress) { - this.zapAddress = zapAddress; - } - - public int getZapPort() { - return zapPort; - } - - public void setZapPort(int zapPort) { - this.zapPort = zapPort; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean debug) { - this.debug = debug; - } - - public String getApikey() { - return apikey; - } - - public void setApikey(String apikey) { - this.apikey = apikey; - } - - protected String extractValue(ApiResponse element) { - if (element instanceof ApiResponseElement) { - return ((ApiResponseElement) element).getValue(); - } - return null; - } -} diff --git a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java b/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java deleted file mode 100644 index 00d72ec..0000000 --- a/subprojects/zap-clientapi-ant/src/test/java/org/zaproxy/clientapi/ant/BuildTest.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright 2017 The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.zaproxy.clientapi.ant; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import fi.iki.elonen.NanoHTTPD; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.HashMap; -import java.util.Map; -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.BuildFileRule; -import org.apache.tools.ant.filters.StringInputStream; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.zaproxy.clientapi.core.ClientApiException; - -/** Tests that the tasks accept the expected attributes and nested elements. */ -public class BuildTest { - - private static final String BUILD_FILE_NAME = "build.xml"; - private static final String REPORT_PATH = "report.html"; - - private static SimpleServer zap; - private static SimpleServer targetSite; - - @Rule public final TemporaryFolder buildDir = new TemporaryFolder(); - - @Rule public final BuildFileRule buildRule = new BuildFileRule(); - - @BeforeClass - public static void setUp() throws IOException { - zap = - new SimpleServer( - "text/xml; charset=UTF-8", - "OK"); - - targetSite = new SimpleServer("text/plain", ""); - } - - @Before - public void setUpBuildFile() { - zap.clearResponses(); - - File buildFile = new File(buildDir.getRoot(), BUILD_FILE_NAME); - if (!buildFile.exists()) { - try { - try (InputStream is = BuildTest.class.getResourceAsStream(BUILD_FILE_NAME)) { - Files.copy(is, buildFile.toPath()); - } - } catch (IOException e) { - throw new RuntimeException("Failed to set up the test:", e); - } - } - - buildRule.configureProject(buildFile.getAbsolutePath()); - - // Properties used in build.xml file - buildRule.getProject().setProperty("zap.addr", "localhost"); - buildRule.getProject().setProperty("zap.port", Integer.toString(zap.getListeningPort())); - buildRule.getProject().setProperty("zap.key", "API_KEY"); - buildRule - .getProject() - .setProperty("zap.targetUrl", "http://localhost:" + targetSite.getListeningPort()); - buildRule.getProject().setProperty("zap.session", "session"); - buildRule.getProject().setProperty("zap.report.path", REPORT_PATH); - buildRule.getProject().setProperty("zap.report.type", "html"); - buildRule.getProject().setProperty("zap.report.overwrite", "false"); - } - - @AfterClass - public static void tearDown() { - if (zap != null) { - zap.stop(); - } - - if (targetSite != null) { - targetSite.stop(); - } - } - - @Test - public void shouldExecuteTargetAccessUrl() { - buildRule.executeTarget("accessUrl"); - } - - @Test - public void shouldExecuteTargetActiveScanSubtree() { - zap.addResponse("http://zap/xml/ascan/action/scan/", "0"); - zap.addResponse("http://zap/xml/ascan/view/status/", "100"); - buildRule.executeTarget("activeScanSubtree"); - } - - @Test - public void shouldExecuteTargetActiveScanUrl() { - zap.addResponse("http://zap/xml/ascan/action/scan/", "0"); - zap.addResponse("http://zap/xml/ascan/view/status/", "100"); - buildRule.executeTarget("activeScanUrl"); - } - - @Test - public void shouldExecuteTargetAlertCheck() { - try { - buildRule.executeTarget("alertCheck"); - fail("Expected BuildException."); - } catch (BuildException e) { - assertTrue(e.getCause() instanceof ClientApiException); - assertTrue(e.getCause().getMessage().startsWith("Not found 1 alerts")); - } - } - - @Test - public void shouldExecuteTargetLoadSession() { - buildRule.executeTarget("loadSession"); - } - - @Test - public void shouldExecuteTargetNewSession() { - buildRule.executeTarget("newSession"); - } - - @Test - public void shouldExecuteTargetSaveSession() { - buildRule.executeTarget("saveSession"); - } - - @Test - public void shouldExecuteTargetSpider() { - zap.addResponse("http://zap/xml/spider/action/scan/", "0"); - zap.addResponse("http://zap/xml/spider/view/status/", "100"); - buildRule.executeTarget("spider"); - } - - @Test - public void shouldExecuteTargetStopZap() { - buildRule.executeTarget("stopZap"); - } - - @Test - public void shouldExecuteReport() { - buildRule.executeTarget("report"); - assertTrue("Report file not created.", new File(buildDir.getRoot(), REPORT_PATH).exists()); - } - - private static class SimpleServer extends NanoHTTPD { - - private final String mimeType; - private final String defaultResponse; - private final Map pathResponses; - - public SimpleServer(String mimeType, String defaultResponse) throws IOException { - super(0); - start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); - - this.mimeType = mimeType; - this.defaultResponse = defaultResponse; - this.pathResponses = new HashMap<>(); - } - - public void addResponse(String path, String string) { - pathResponses.put(path, string); - } - - public void clearResponses() { - pathResponses.clear(); - } - - @Override - public Response serve(IHTTPSession session) { - String response = pathResponses.get(session.getUri()); - if (response == null) { - response = defaultResponse; - } - return new Response( - Response.Status.OK, - mimeType, - new StringInputStream(response), - response.length()) { - // Extend to access the constructor. - }; - } - } -} diff --git a/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml b/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml deleted file mode 100644 index ffcabd1..0000000 --- a/subprojects/zap-clientapi-ant/src/test/resources/org/zaproxy/clientapi/ant/build.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle b/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle deleted file mode 100644 index 96c8f55..0000000 --- a/subprojects/zap-clientapi-ant/zap-clientapi-ant.gradle +++ /dev/null @@ -1,16 +0,0 @@ - -dependencies { - implementation project(':zap-clientapi') - compileOnly 'org.apache.ant:ant:1.10.13' - - testImplementation 'org.apache.ant:ant-testutil:1.10.13' - testImplementation 'org.nanohttpd:nanohttpd:2.3.1' -} - -jar { - manifest { - attributes 'Implementation-Title': 'ZAP Ant API Client', - 'Implementation-Version': archiveVersion.get(), - 'Create-Date': new Date().format("yyyy-MM-dd") - } -} From 167369b30147f81e18555e781beb52f6e33c92de Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 17 Nov 2023 16:36:36 +0000 Subject: [PATCH 113/148] Deprecate `Exportreport` and update changelog The respective add-on no longer exists. Mention the removal of Ant tasks in the changelog (missed in previous change). Include version in existing deprecated APIs and mark them for removal, now that Java 11 is used. Signed-off-by: thc202 --- CHANGELOG.md | 6 ++++++ .../java/org/zaproxy/clientapi/core/ClientApi.java | 13 ++++++++----- .../org/zaproxy/clientapi/gen/Exportreport.java | 1 + .../org/zaproxy/clientapi/gen/ImportLogFiles.java | 2 +- .../java/org/zaproxy/clientapi/gen/Importurls.java | 2 +- .../org/zaproxy/clientapi/gen/LocalProxies.java | 2 +- 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 856873b..91401b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Deprecated +- The following APIs were deprecated: + - `Exportreport` + +### Removed +- The Ant tasks are no longer provided. ## [1.12.0] - 2023-07-13 ### Changed diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index eb4f553..0130638 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -62,7 +62,6 @@ import org.zaproxy.clientapi.gen.Context; import org.zaproxy.clientapi.gen.Core; import org.zaproxy.clientapi.gen.Exim; -import org.zaproxy.clientapi.gen.Exportreport; import org.zaproxy.clientapi.gen.ForcedUser; import org.zaproxy.clientapi.gen.Graphql; import org.zaproxy.clientapi.gen.HttpSessions; @@ -121,20 +120,24 @@ public class ClientApi { public Context context = new Context(this); public Core core = new Core(this); public Exim exim = new Exim(this); - public Exportreport exportreport = new Exportreport(this); + + @SuppressWarnings("removal") + public org.zaproxy.clientapi.gen.Exportreport exportreport = + new org.zaproxy.clientapi.gen.Exportreport(this); + public ForcedUser forcedUser = new ForcedUser(this); public Graphql graphql = new Graphql(this); public HttpSessions httpSessions = new HttpSessions(this); - @SuppressWarnings("deprecation") + @SuppressWarnings("removal") public org.zaproxy.clientapi.gen.ImportLogFiles logImportFiles = new org.zaproxy.clientapi.gen.ImportLogFiles(this); - @SuppressWarnings("deprecation") + @SuppressWarnings("removal") public org.zaproxy.clientapi.gen.Importurls importurls = new org.zaproxy.clientapi.gen.Importurls(this); - @SuppressWarnings("deprecation") + @SuppressWarnings("removal") public org.zaproxy.clientapi.gen.LocalProxies localProxies = new org.zaproxy.clientapi.gen.LocalProxies(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java index 0a4d326..21058f4 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exportreport.java @@ -27,6 +27,7 @@ /** This file was automatically generated. */ @SuppressWarnings("javadoc") +@Deprecated(since = "1.13.0", forRemoval = true) public class Exportreport { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java index 94ea1bb..c7081e9 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ImportLogFiles.java @@ -31,7 +31,7 @@ * @deprecated Use {@link Exim} instead. */ @SuppressWarnings("javadoc") -@Deprecated +@Deprecated(since = "1.11.0", forRemoval = true) public class ImportLogFiles extends org.zaproxy.clientapi.gen.deprecated.ImportLogFilesDeprecated { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java index 829d733..f534a81 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Importurls.java @@ -31,7 +31,7 @@ * @deprecated Use {@link Exim} instead. */ @SuppressWarnings("javadoc") -@Deprecated +@Deprecated(since = "1.11.0", forRemoval = true) public class Importurls { private final ClientApi api; diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java index 0245784..402a737 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/LocalProxies.java @@ -31,7 +31,7 @@ * @deprecated Use {@link Network} instead. */ @SuppressWarnings("javadoc") -@Deprecated +@Deprecated(since = "1.11.0", forRemoval = true) public class LocalProxies { private final ClientApi api; From a9bb6a1007ec86e4f2731c56f0863c658d5f4291 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Nov 2023 11:03:22 +0000 Subject: [PATCH 114/148] Stop sending API key as query parameter Send only as an HTTP header, which is supported by ZAP since 2.6.0. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ .../java/org/zaproxy/clientapi/core/ClientApi.java | 12 ------------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91401b4..5690e57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed +- Stop sending the API key as query parameter, not needed since ZAP 2.6.0. + ### Deprecated - The following APIs were deprecated: - `Exportreport` diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 0130638..5dcd3f8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -92,7 +92,6 @@ public class ClientApi { private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; private static final String ZAP_API_KEY_HEADER = "X-ZAP-API-Key"; - private static final String ZAP_API_KEY_PARAM = "apikey"; private Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 8090)); private boolean debug = false; @@ -486,10 +485,6 @@ private HttpRequest buildZapRequest( sb.append(method); sb.append('/'); if (params != null) { - if (apiKey != null && !apiKey.isEmpty()) { - params.put(ZAP_API_KEY_PARAM, apiKey); - } - sb.append('?'); for (Map.Entry p : params.entrySet()) { sb.append(encodeQueryParam(p.getKey())); @@ -499,13 +494,6 @@ private HttpRequest buildZapRequest( } sb.append('&'); } - } else if (apiKey != null && !apiKey.isEmpty()) { - // Send the API key even if there are no parameters, - // older ZAP versions might need it as (query) parameter. - sb.append('?'); - sb.append(encodeQueryParam(ZAP_API_KEY_PARAM)); - sb.append('='); - sb.append(encodeQueryParam(apiKey)); } HttpRequest request = new HttpRequest(createUrl(sb.toString())); From 4c1467af2a14ea1368de0c75230fb4052c355ad0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Nov 2023 11:14:18 +0000 Subject: [PATCH 115/148] Update actions in CI workflow Use the latest versions, which addresses deprecation warnings. Use Gradle actions for build/cache and wrapper validation. Signed-off-by: thc202 --- .github/workflows/ci.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c8834c..67de714 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,18 +14,12 @@ jobs: java: [11] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 with: + distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ matrix.java }}-${{ hashFiles('**/*.gradle*') }} - restore-keys: | - ${{ runner.os }}-gradle-${{ matrix.java }}- - ${{ runner.os }}-gradle- + - uses: gradle/wrapper-validation-action@v1 + - uses: gradle/gradle-build-action@v2 - run: ./gradlew assemble - run: ./gradlew check From 72fe7ef2ba149cceea7adc7155030cdf77ffb2b1 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Nov 2023 15:19:46 +0000 Subject: [PATCH 116/148] Allow to call the API with custom HTTP method Change the call API methods to allow to specify the method, if not GET the parameters are sent in the body. Signed-off-by: thc202 --- CHANGELOG.md | 1 + .../org/zaproxy/clientapi/core/ClientApi.java | 102 +++++++++++++++--- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5690e57..c35a7f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Changed - Stop sending the API key as query parameter, not needed since ZAP 2.6.0. +- Allow to call the ZAP API with custom HTTP method (e.g. file upload). ### Deprecated - The following APIs were deprecated: diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 5dcd3f8..9717b3a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; @@ -374,15 +375,30 @@ private static URL createUrl(String value) throws MalformedURLException, URISynt public ApiResponse callApi( String component, String type, String method, Map params) throws ClientApiException { - Document dom = this.callApiDom(component, type, method, params); + return callApi(HttpRequest.GET_METHOD, component, type, method, params); + } + + public ApiResponse callApi( + String requestMethod, + String component, + String type, + String method, + Map params) + throws ClientApiException { + Document dom = this.callApiDom(requestMethod, component, type, method, params); return ApiResponseFactory.getResponse(dom.getFirstChild()); } private Document callApiDom( - String component, String type, String method, Map params) + String requestMethod, + String component, + String type, + String method, + Map params) throws ClientApiException { try { - HttpRequest request = buildZapRequest("xml", component, type, method, params); + HttpRequest request = + buildZapRequest(requestMethod, "xml", component, type, method, params); if (debug) { debugStream.println("Open URL: " + request.getRequestUri()); } @@ -422,6 +438,17 @@ private InputStream getConnectionInputStream(HttpRequest request) throws IOExcep for (Entry header : request.getHeaders().entrySet()) { uc.setRequestProperty(header.getKey(), header.getValue()); } + if (!isGetRequest(request.getMethod())) { + uc.setRequestMethod(request.getMethod()); + String body = request.getBody(); + if (body != null && !body.isEmpty()) { + uc.setDoOutput(true); + try (var os = + new OutputStreamWriter(uc.getOutputStream(), StandardCharsets.UTF_8)) { + os.write(request.getBody()); + } + } + } uc.connect(); if (uc.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { return uc.getErrorStream(); @@ -432,8 +459,19 @@ private InputStream getConnectionInputStream(HttpRequest request) throws IOExcep public byte[] callApiOther( String component, String type, String method, Map params) throws ClientApiException { + return callApiOther(HttpRequest.GET_METHOD, component, type, method, params); + } + + public byte[] callApiOther( + String requestMethod, + String component, + String type, + String method, + Map params) + throws ClientApiException { try { - HttpRequest request = buildZapRequest("other", component, type, method, params); + HttpRequest request = + buildZapRequest(requestMethod, "other", component, type, method, params); if (debug) { debugStream.println("Open URL: " + request.getRequestUri()); } @@ -462,6 +500,7 @@ public byte[] callApiOther( *

As the API client proxies through ZAP the built API requests use a specific domain, {@code * zap}, to ensure that they are always handled by ZAP (and not forward). * + * @param requestMethod the HTTP request method. * @param format the desired format of the API response (e.g. XML, JSON, other). * @param component the API component (e.g. core, spider). * @param type the type of the API endpoint (e.g. action, view). @@ -472,7 +511,12 @@ public byte[] callApiOther( * @throws URISyntaxException if an error occurred while building the URL. */ private HttpRequest buildZapRequest( - String format, String component, String type, String method, Map params) + String requestMethod, + String format, + String component, + String type, + String method, + Map params) throws MalformedURLException, URISyntaxException { StringBuilder sb = new StringBuilder(); sb.append("http://zap/"); @@ -484,25 +528,39 @@ private HttpRequest buildZapRequest( sb.append('/'); sb.append(method); sb.append('/'); + String body = null; if (params != null) { - sb.append('?'); - for (Map.Entry p : params.entrySet()) { - sb.append(encodeQueryParam(p.getKey())); - sb.append('='); - if (p.getValue() != null) { - sb.append(encodeQueryParam(p.getValue())); - } - sb.append('&'); + if (isGetRequest(requestMethod)) { + sb.append('?'); + appendParams(params, sb); + } else { + body = appendParams(params, new StringBuilder()).toString(); } } - HttpRequest request = new HttpRequest(createUrl(sb.toString())); + HttpRequest request = new HttpRequest(requestMethod, createUrl(sb.toString()), body); if (apiKey != null && !apiKey.isEmpty()) { request.addHeader(ZAP_API_KEY_HEADER, apiKey); } return request; } + private static boolean isGetRequest(String requestMethod) { + return HttpRequest.GET_METHOD.equals(requestMethod); + } + + private static StringBuilder appendParams(Map params, StringBuilder sb) { + for (Map.Entry p : params.entrySet()) { + sb.append(encodeQueryParam(p.getKey())); + sb.append('='); + if (p.getValue() != null) { + sb.append(encodeQueryParam(p.getValue())); + } + sb.append('&'); + } + return sb; + } + private static String encodeQueryParam(String param) { try { return URLEncoder.encode(param, "UTF-8"); @@ -748,12 +806,22 @@ private static ClientApiException newTimeoutConnectionToZap(int timeoutInSeconds */ private static class HttpRequest { + private static final String GET_METHOD = "GET"; + + private final String method; private final URL requestUri; private final Map headers; + private final String body; - public HttpRequest(URL url) { + public HttpRequest(String method, URL url, String body) { + this.method = method; this.requestUri = url; this.headers = new HashMap<>(); + this.body = body; + } + + public String getMethod() { + return method; } /** @@ -786,5 +854,9 @@ public void addHeader(String name, String value) { public Map getHeaders() { return Collections.unmodifiableMap(headers); } + + public String getBody() { + return body; + } } } From b5df1ecd12d9bb8da70e7721ae4c57c4f6e5c3b8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Nov 2023 18:32:19 +0000 Subject: [PATCH 117/148] Update APIs of add-ons and core Update core APIs for 2.14.0. Add/update the APIs of the following add-ons: - Selenium version 15.16.0 - Custom Payloads version 0.13.0 Signed-off-by: thc202 --- CHANGELOG.md | 7 + .../java/org/zaproxy/clientapi/gen/Acsrf.java | 8 + .../java/org/zaproxy/clientapi/gen/Alert.java | 32 ++++ .../java/org/zaproxy/clientapi/gen/Core.java | 25 +++ .../zaproxy/clientapi/gen/Custompayloads.java | 145 ++++++++++++++++++ .../org/zaproxy/clientapi/gen/Selenium.java | 66 ++++++++ 6 files changed, 283 insertions(+) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Custompayloads.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c35a7f2..daa06dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add the APIs of the following add-on: + - Custom Payloads version 0.13.0. + ### Changed +- Update core APIs for 2.14. +- Update the APIs of the following add-on: + - Selenium version 15.16.0. - Stop sending the API key as query parameter, not needed since ZAP 2.6.0. - Allow to call the ZAP API with custom HTTP method (e.g. file upload). diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java index 5cbe601..68a9b14 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Acsrf.java @@ -69,8 +69,16 @@ public ApiResponse setOptionPartialMatchingEnabled(boolean bool) throws ClientAp /** Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ public byte[] genForm(String hrefid) throws ClientApiException { + return genFormActionUrl(hrefid, null); + } + + /** Generate a form for testing lack of anti-CSRF tokens - typically invoked via ZAP */ + public byte[] genFormActionUrl(String hrefid, String actionurl) throws ClientApiException { Map map = new HashMap<>(); map.put("hrefId", hrefid); + if (actionurl != null) { + map.put("actionUrl", actionurl); + } return api.callApiOther("acsrf", "other", "genForm", map); } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java index 864d284..f583720 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java @@ -51,6 +51,16 @@ public ApiResponse alert(String id) throws ClientApiException { */ public ApiResponse alerts(String baseurl, String start, String count, String riskid) throws ClientApiException { + return alerts(baseurl, start, count, riskid, null); + } + + /** + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with + * 'start' position and 'count' of alerts + */ + public ApiResponse alerts( + String baseurl, String start, String count, String riskid, String contextname) + throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); @@ -64,6 +74,9 @@ public ApiResponse alerts(String baseurl, String start, String count, String ris if (riskid != null) { map.put("riskId", riskid); } + if (contextname != null) { + map.put("contextName", contextname); + } return api.callApi("alert", "view", "alerts", map); } @@ -121,6 +134,25 @@ public ApiResponse deleteAllAlerts() throws ClientApiException { return api.callApi("alert", "action", "deleteAllAlerts", null); } + /** + * Deletes all the alerts optionally filtered by URL which fall within the Context with the + * provided name, risk, or base URL. + */ + public ApiResponse deleteAlerts(String contextname, String baseurl, String riskid) + throws ClientApiException { + Map map = new HashMap<>(); + if (contextname != null) { + map.put("contextName", contextname); + } + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (riskid != null) { + map.put("riskId", riskid); + } + return api.callApi("alert", "action", "deleteAlerts", map); + } + /** Deletes the alert with the given ID. */ public ApiResponse deleteAlert(String id) throws ClientApiException { Map map = new HashMap<>(); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index bd9dc20..194a8f8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -672,6 +672,13 @@ public ApiResponse disableClientCertificate() throws ClientApiException { return api.callApi("core", "action", "disableClientCertificate", null); } + /** Create a zip file of the ZAP core and add-on SBOMs */ + public ApiResponse createSbomZip(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("core", "action", "createSbomZip", map); + } + /** * Deletes all alerts of the current session. * @@ -989,4 +996,22 @@ public byte[] sendHarRequest(String request, String followredirects) throws Clie } return api.callApiOther("core", "other", "sendHarRequest", map); } + + /** Download a file from the transfer directory */ + public byte[] fileDownload(String filename) throws ClientApiException { + Map map = new HashMap<>(); + map.put("fileName", filename); + return api.callApiOther("core", "other", "fileDownload", map); + } + + /** + * Upload a file to the transfer directory. Only POST requests accepted with encodings of + * "multipart/form-data" or "application/x-www-form-urlencoded". + */ + public byte[] fileUpload(String filename, String filecontents) throws ClientApiException { + Map map = new HashMap<>(); + map.put("fileName", filename); + map.put("fileContents", filecontents); + return api.callApiOther("POST", "core", "other", "fileUpload", map); + } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Custompayloads.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Custompayloads.java new file mode 100644 index 0000000..b57e5b5 --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Custompayloads.java @@ -0,0 +1,145 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2023 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Custompayloads { + + private final ClientApi api; + + public Custompayloads(ClientApi api) { + this.api = api; + } + + /** + * Lists all available categories. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse customPayloadsCategories() throws ClientApiException { + return api.callApi("custompayloads", "view", "customPayloadsCategories", null); + } + + /** + * Lists all the payloads currently loaded (category, payload, enabled state). Optionally + * filtered by category. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse customPayloads(String category) throws ClientApiException { + Map map = new HashMap<>(); + if (category != null) { + map.put("category", category); + } + return api.callApi("custompayloads", "view", "customPayloads", map); + } + + /** + * Disables payloads for a given category. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse disableCustomPayloads(String category) throws ClientApiException { + Map map = new HashMap<>(); + if (category != null) { + map.put("category", category); + } + return api.callApi("custompayloads", "action", "disableCustomPayloads", map); + } + + /** + * Enables payloads for a given category. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse enableCustomPayloads(String category) throws ClientApiException { + Map map = new HashMap<>(); + if (category != null) { + map.put("category", category); + } + return api.callApi("custompayloads", "action", "enableCustomPayloads", map); + } + + /** + * Removes a payload. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeCustomPayload(String category, String payload) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("category", category); + if (payload != null) { + map.put("payload", payload); + } + return api.callApi("custompayloads", "action", "removeCustomPayload", map); + } + + /** + * Adds a new payload. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addCustomPayload(String category, String payload) throws ClientApiException { + Map map = new HashMap<>(); + map.put("category", category); + if (payload != null) { + map.put("payload", payload); + } + return api.callApi("custompayloads", "action", "addCustomPayload", map); + } + + /** + * Enables a given payload. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse enableCustomPayload(String category, String payload) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("category", category); + if (payload != null) { + map.put("payload", payload); + } + return api.callApi("custompayloads", "action", "enableCustomPayload", map); + } + + /** + * Disables a given payload. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse disableCustomPayload(String category, String payload) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("category", category); + if (payload != null) { + map.put("payload", payload); + } + return api.callApi("custompayloads", "action", "disableCustomPayload", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 0bc98b0..9a24d59 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -68,6 +68,11 @@ public ApiResponse optionFirefoxBinaryPath() throws ClientApiException { return api.callApi("selenium", "view", "optionFirefoxBinaryPath", null); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionFirefoxDefaultProfile() throws ClientApiException { + return api.callApi("selenium", "view", "optionFirefoxDefaultProfile", null); + } + /** * Returns the current path to Firefox driver (geckodriver) * @@ -94,6 +99,17 @@ public ApiResponse optionPhantomJsBinaryPath() throws ClientApiException { return api.callApi("selenium", "view", "optionPhantomJsBinaryPath", null); } + /** + * Gets the browser arguments. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getBrowserArguments(String browser) throws ClientApiException { + Map map = new HashMap<>(); + map.put("browser", browser); + return api.callApi("selenium", "view", "getBrowserArguments", map); + } + /** * Sets the current path to Chrome binary * @@ -127,6 +143,13 @@ public ApiResponse setOptionFirefoxBinaryPath(String string) throws ClientApiExc return api.callApi("selenium", "action", "setOptionFirefoxBinaryPath", map); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionFirefoxDefaultProfile(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionFirefoxDefaultProfile", map); + } + /** * Sets the current path to Firefox driver (geckodriver) * @@ -160,4 +183,47 @@ public ApiResponse setOptionPhantomJsBinaryPath(String string) throws ClientApiE map.put("String", string); return api.callApi("selenium", "action", "setOptionPhantomJsBinaryPath", map); } + + /** + * Adds a browser argument. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse addBrowserArgument(String browser, String argument, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("browser", browser); + map.put("argument", argument); + if (enabled != null) { + map.put("enabled", enabled); + } + return api.callApi("selenium", "action", "addBrowserArgument", map); + } + + /** + * Removes a browser argument. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse removeBrowserArgument(String browser, String argument) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("browser", browser); + map.put("argument", argument); + return api.callApi("selenium", "action", "removeBrowserArgument", map); + } + + /** + * Sets whether or not a browser argument is enabled. + * + *

This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setBrowserArgumentEnabled(String browser, String argument, String enabled) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("browser", browser); + map.put("argument", argument); + map.put("enabled", enabled); + return api.callApi("selenium", "action", "setBrowserArgumentEnabled", map); + } } From 7bacbda6ea377b0379a426fd632a86abaf949fed Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 21 Nov 2023 09:07:01 +0000 Subject: [PATCH 118/148] Release 1.13.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daa06dc..aa9d505 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.13.0] - 2023-11-21 ### Added - Add the APIs of the following add-on: - Custom Payloads version 0.13.0. @@ -193,7 +193,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...HEAD +[1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 [1.10.0]: https://github.com/zaproxy/zap-api-java/compare/v1.9.0...v1.10.0 diff --git a/README.md b/README.md index 0e7482e..1fdd7e1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.12.0` + * Version: `1.13.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle.kts b/build.gradle.kts index 455771d..98c62a9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ subprojects { group = "org.zaproxy" - version = "1.13.0-SNAPSHOT" + version = "1.13.0" extra["versionBC"] = "1.12.0" repositories { From 944269dd623872d0f0825ec3f8785f4b9a1d6a62 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 21 Nov 2023 10:03:59 +0000 Subject: [PATCH 119/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle.kts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa9d505..02c06eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.13.0] - 2023-11-21 ### Added - Add the APIs of the following add-on: @@ -193,6 +195,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...HEAD [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 diff --git a/build.gradle.kts b/build.gradle.kts index 98c62a9..b62fa57 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,8 @@ subprojects { group = "org.zaproxy" - version = "1.13.0" - extra["versionBC"] = "1.12.0" + version = "1.14.0-SNAPSHOT" + extra["versionBC"] = "1.13.0" repositories { mavenCentral() From 5f661c9b18ffe1271f2d19d00fe4e83d132e39d2 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 1 Dec 2023 10:38:08 +0000 Subject: [PATCH 120/148] Update Gradle to 8.5, use Java 21 in CI Update Gradle Wrapper to 8.5. Apply the common plugins and remove now redundant configurations. Update GitHub Action in CI workflow and add Java 21. Address warns with Java 21, either by code changes or suppression. Signed-off-by: thc202 --- .github/workflows/ci.yml | 4 ++-- build.gradle.kts | 16 +++------------ gradle/spotless/license.java | 19 ------------------ gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 17 ++++++++-------- settings.gradle.kts | 6 ++++++ .../clientapi/core/ApiResponseList.java | 10 ++++++--- .../org/zaproxy/clientapi/core/ClientApi.java | 1 + 9 files changed, 30 insertions(+), 47 deletions(-) delete mode 100644 gradle/spotless/license.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67de714..dafcd0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,11 +11,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [11] + java: [11, 21] steps: - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: ${{ matrix.java }} diff --git a/build.gradle.kts b/build.gradle.kts index b62fa57..bde81fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,24 +1,22 @@ import net.ltgt.gradle.errorprone.errorprone plugins { - id("com.diffplug.spotless") version "6.20.0" + id("com.diffplug.spotless") id("net.ltgt.errorprone") version "3.1.0" + id("org.zaproxy.common") } subprojects { apply(plugin = "java-library") apply(plugin = "com.diffplug.spotless") apply(plugin = "net.ltgt.errorprone") + apply(plugin = "org.zaproxy.common") group = "org.zaproxy" version = "1.14.0-SNAPSHOT" extra["versionBC"] = "1.13.0" - repositories { - mavenCentral() - } - java { val javaVersion = JavaVersion.VERSION_11 sourceCompatibility = javaVersion @@ -26,12 +24,6 @@ subprojects { } spotless { - java { - licenseHeaderFile("$rootDir/gradle/spotless/license.java") - - googleJavaFormat("1.17.0").aosp() - } - kotlin { ktlint() } @@ -46,8 +38,6 @@ subprojects { } tasks.withType { - options.encoding = "utf-8" - options.compilerArgs = listOf("-Xlint:all", "-Werror") options.errorprone { disable("EmptyBlockTag", "InlineMeSuggester") } diff --git a/gradle/spotless/license.java b/gradle/spotless/license.java deleted file mode 100644 index 6c2dca3..0000000 --- a/gradle/spotless/license.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Zed Attack Proxy (ZAP) and its related class files. - * - * ZAP is an HTTP/HTTPS proxy for assessing web application security. - * - * Copyright $YEAR The ZAP Development Team - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 zcma&NWl&^owk(X(xVyW%ySuwf;qI=D6|RlDJ2cR^yEKh!@I- zp9QeisK*rlxC>+~7Dk4IxIRsKBHqdR9b3+fyL=ynHmIDe&|>O*VlvO+%z5;9Z$|DJ zb4dO}-R=MKr^6EKJiOrJdLnCJn>np?~vU-1sSFgPu;pthGwf}bG z(1db%xwr#x)r+`4AGu$j7~u2MpVs3VpLp|mx&;>`0p0vH6kF+D2CY0fVdQOZ@h;A` z{infNyvmFUiu*XG}RNMNwXrbec_*a3N=2zJ|Wh5z* z5rAX$JJR{#zP>KY**>xHTuw?|-Rg|o24V)74HcfVT;WtQHXlE+_4iPE8QE#DUm%x0 zEKr75ur~W%w#-My3Tj`hH6EuEW+8K-^5P62$7Sc5OK+22qj&Pd1;)1#4tKihi=~8C zHiQSst0cpri6%OeaR`PY>HH_;CPaRNty%WTm4{wDK8V6gCZlG@U3$~JQZ;HPvDJcT1V{ z?>H@13MJcCNe#5z+MecYNi@VT5|&UiN1D4ATT+%M+h4c$t;C#UAs3O_q=GxK0}8%8 z8J(_M9bayxN}69ex4dzM_P3oh@ZGREjVvn%%r7=xjkqxJP4kj}5tlf;QosR=%4L5y zWhgejO=vao5oX%mOHbhJ8V+SG&K5dABn6!WiKl{|oPkq(9z8l&Mm%(=qGcFzI=eLu zWc_oCLyf;hVlB@dnwY98?75B20=n$>u3b|NB28H0u-6Rpl((%KWEBOfElVWJx+5yg z#SGqwza7f}$z;n~g%4HDU{;V{gXIhft*q2=4zSezGK~nBgu9-Q*rZ#2f=Q}i2|qOp z!!y4p)4o=LVUNhlkp#JL{tfkhXNbB=Ox>M=n6soptJw-IDI|_$is2w}(XY>a=H52d z3zE$tjPUhWWS+5h=KVH&uqQS=$v3nRs&p$%11b%5qtF}S2#Pc`IiyBIF4%A!;AVoI zXU8-Rpv!DQNcF~(qQnyyMy=-AN~U>#&X1j5BLDP{?K!%h!;hfJI>$mdLSvktEr*89 zdJHvby^$xEX0^l9g$xW-d?J;L0#(`UT~zpL&*cEh$L|HPAu=P8`OQZV!-}l`noSp_ zQ-1$q$R-gDL)?6YaM!=8H=QGW$NT2SeZlb8PKJdc=F-cT@j7Xags+Pr*jPtlHFnf- zh?q<6;)27IdPc^Wdy-mX%2s84C1xZq9Xms+==F4);O`VUASmu3(RlgE#0+#giLh-& zcxm3_e}n4{%|X zJp{G_j+%`j_q5}k{eW&TlP}J2wtZ2^<^E(O)4OQX8FDp6RJq!F{(6eHWSD3=f~(h} zJXCf7=r<16X{pHkm%yzYI_=VDP&9bmI1*)YXZeB}F? z(%QsB5fo*FUZxK$oX~X^69;x~j7ms8xlzpt-T15e9}$4T-pC z6PFg@;B-j|Ywajpe4~bk#S6(fO^|mm1hKOPfA%8-_iGCfICE|=P_~e;Wz6my&)h_~ zkv&_xSAw7AZ%ThYF(4jADW4vg=oEdJGVOs>FqamoL3Np8>?!W#!R-0%2Bg4h?kz5I zKV-rKN2n(vUL%D<4oj@|`eJ>0i#TmYBtYmfla;c!ATW%;xGQ0*TW@PTlGG><@dxUI zg>+3SiGdZ%?5N=8uoLA|$4isK$aJ%i{hECP$bK{J#0W2gQ3YEa zZQ50Stn6hqdfxJ*9#NuSLwKFCUGk@c=(igyVL;;2^wi4o30YXSIb2g_ud$ zgpCr@H0qWtk2hK8Q|&wx)}4+hTYlf;$a4#oUM=V@Cw#!$(nOFFpZ;0lc!qd=c$S}Z zGGI-0jg~S~cgVT=4Vo)b)|4phjStD49*EqC)IPwyeKBLcN;Wu@Aeph;emROAwJ-0< z_#>wVm$)ygH|qyxZaet&(Vf%pVdnvKWJn9`%DAxj3ot;v>S$I}jJ$FLBF*~iZ!ZXE zkvui&p}fI0Y=IDX)mm0@tAd|fEHl~J&K}ZX(Mm3cm1UAuwJ42+AO5@HwYfDH7ipIc zmI;1J;J@+aCNG1M`Btf>YT>~c&3j~Qi@Py5JT6;zjx$cvOQW@3oQ>|}GH?TW-E z1R;q^QFjm5W~7f}c3Ww|awg1BAJ^slEV~Pk`Kd`PS$7;SqJZNj->it4DW2l15}xP6 zoCl$kyEF%yJni0(L!Z&14m!1urXh6Btj_5JYt1{#+H8w?5QI%% zo-$KYWNMJVH?Hh@1n7OSu~QhSswL8x0=$<8QG_zepi_`y_79=nK=_ZP_`Em2UI*tyQoB+r{1QYZCpb?2OrgUw#oRH$?^Tj!Req>XiE#~B|~ z+%HB;=ic+R@px4Ld8mwpY;W^A%8%l8$@B@1m5n`TlKI6bz2mp*^^^1mK$COW$HOfp zUGTz-cN9?BGEp}5A!mDFjaiWa2_J2Iq8qj0mXzk; z66JBKRP{p%wN7XobR0YjhAuW9T1Gw3FDvR5dWJ8ElNYF94eF3ebu+QwKjtvVu4L zI9ip#mQ@4uqVdkl-TUQMb^XBJVLW(-$s;Nq;@5gr4`UfLgF$adIhd?rHOa%D);whv z=;krPp~@I+-Z|r#s3yCH+c1US?dnm+C*)r{m+86sTJusLdNu^sqLrfWed^ndHXH`m zd3#cOe3>w-ga(Dus_^ppG9AC>Iq{y%%CK+Cro_sqLCs{VLuK=dev>OL1dis4(PQ5R zcz)>DjEkfV+MO;~>VUlYF00SgfUo~@(&9$Iy2|G0T9BSP?&T22>K46D zL*~j#yJ?)^*%J3!16f)@Y2Z^kS*BzwfAQ7K96rFRIh>#$*$_Io;z>ux@}G98!fWR@ zGTFxv4r~v)Gsd|pF91*-eaZ3Qw1MH$K^7JhWIdX%o$2kCbvGDXy)a?@8T&1dY4`;L z4Kn+f%SSFWE_rpEpL9bnlmYq`D!6F%di<&Hh=+!VI~j)2mfil03T#jJ_s?}VV0_hp z7T9bWxc>Jm2Z0WMU?`Z$xE74Gu~%s{mW!d4uvKCx@WD+gPUQ zV0vQS(Ig++z=EHN)BR44*EDSWIyT~R4$FcF*VEY*8@l=218Q05D2$|fXKFhRgBIEE zdDFB}1dKkoO^7}{5crKX!p?dZWNz$m>1icsXG2N+((x0OIST9Zo^DW_tytvlwXGpn zs8?pJXjEG;T@qrZi%#h93?FP$!&P4JA(&H61tqQi=opRzNpm zkrG}$^t9&XduK*Qa1?355wd8G2CI6QEh@Ua>AsD;7oRUNLPb76m4HG3K?)wF~IyS3`fXuNM>${?wmB zpVz;?6_(Fiadfd{vUCBM*_kt$+F3J+IojI;9L(gc9n3{sEZyzR9o!_mOwFC#tQ{Q~ zP3-`#uK#tP3Q7~Q;4H|wjZHO8h7e4IuBxl&vz2w~D8)w=Wtg31zpZhz%+kzSzL*dV zwp@{WU4i;hJ7c2f1O;7Mz6qRKeASoIv0_bV=i@NMG*l<#+;INk-^`5w@}Dj~;k=|}qM1vq_P z|GpBGe_IKq|LNy9SJhKOQ$c=5L{Dv|Q_lZl=-ky*BFBJLW9&y_C|!vyM~rQx=!vun z?rZJQB5t}Dctmui5i31C_;_}CEn}_W%>oSXtt>@kE1=JW*4*v4tPp;O6 zmAk{)m!)}34pTWg8{i>($%NQ(Tl;QC@J@FfBoc%Gr&m560^kgSfodAFrIjF}aIw)X zoXZ`@IsMkc8_=w%-7`D6Y4e*CG8k%Ud=GXhsTR50jUnm+R*0A(O3UKFg0`K;qp1bl z7``HN=?39ic_kR|^R^~w-*pa?Vj#7|e9F1iRx{GN2?wK!xR1GW!qa=~pjJb-#u1K8 zeR?Y2i-pt}yJq;SCiVHODIvQJX|ZJaT8nO+(?HXbLefulKKgM^B(UIO1r+S=7;kLJ zcH}1J=Px2jsh3Tec&v8Jcbng8;V-`#*UHt?hB(pmOipKwf3Lz8rG$heEB30Sg*2rx zV<|KN86$soN(I!BwO`1n^^uF2*x&vJ$2d$>+`(romzHP|)K_KkO6Hc>_dwMW-M(#S zK(~SiXT1@fvc#U+?|?PniDRm01)f^#55;nhM|wi?oG>yBsa?~?^xTU|fX-R(sTA+5 zaq}-8Tx7zrOy#3*JLIIVsBmHYLdD}!0NP!+ITW+Thn0)8SS!$@)HXwB3tY!fMxc#1 zMp3H?q3eD?u&Njx4;KQ5G>32+GRp1Ee5qMO0lZjaRRu&{W<&~DoJNGkcYF<5(Ab+J zgO>VhBl{okDPn78<%&e2mR{jwVCz5Og;*Z;;3%VvoGo_;HaGLWYF7q#jDX=Z#Ml`H z858YVV$%J|e<1n`%6Vsvq7GmnAV0wW4$5qQ3uR@1i>tW{xrl|ExywIc?fNgYlA?C5 zh$ezAFb5{rQu6i7BSS5*J-|9DQ{6^BVQ{b*lq`xS@RyrsJN?-t=MTMPY;WYeKBCNg z^2|pN!Q^WPJuuO4!|P@jzt&tY1Y8d%FNK5xK(!@`jO2aEA*4 zkO6b|UVBipci?){-Ke=+1;mGlND8)6+P;8sq}UXw2hn;fc7nM>g}GSMWu&v&fqh

iViYT=fZ(|3Ox^$aWPp4a8h24tD<|8-!aK0lHgL$N7Efw}J zVIB!7=T$U`ao1?upi5V4Et*-lTG0XvExbf!ya{cua==$WJyVG(CmA6Of*8E@DSE%L z`V^$qz&RU$7G5mg;8;=#`@rRG`-uS18$0WPN@!v2d{H2sOqP|!(cQ@ zUHo!d>>yFArLPf1q`uBvY32miqShLT1B@gDL4XoVTK&@owOoD)OIHXrYK-a1d$B{v zF^}8D3Y^g%^cnvScOSJR5QNH+BI%d|;J;wWM3~l>${fb8DNPg)wrf|GBP8p%LNGN# z3EaIiItgwtGgT&iYCFy9-LG}bMI|4LdmmJt@V@% zb6B)1kc=T)(|L@0;wr<>=?r04N;E&ef+7C^`wPWtyQe(*pD1pI_&XHy|0gIGHMekd zF_*M4yi6J&Z4LQj65)S zXwdM{SwUo%3SbPwFsHgqF@V|6afT|R6?&S;lw=8% z3}@9B=#JI3@B*#4s!O))~z zc>2_4Q_#&+5V`GFd?88^;c1i7;Vv_I*qt!_Yx*n=;rj!82rrR2rQ8u5(Ejlo{15P% zs~!{%XJ>FmJ})H^I9bn^Re&38H{xA!0l3^89k(oU;bZWXM@kn$#aoS&Y4l^-WEn-fH39Jb9lA%s*WsKJQl?n9B7_~P z-XM&WL7Z!PcoF6_D>V@$CvUIEy=+Z&0kt{szMk=f1|M+r*a43^$$B^MidrT0J;RI` z(?f!O<8UZkm$_Ny$Hth1J#^4ni+im8M9mr&k|3cIgwvjAgjH z8`N&h25xV#v*d$qBX5jkI|xOhQn!>IYZK7l5#^P4M&twe9&Ey@@GxYMxBZq2e7?`q z$~Szs0!g{2fGcp9PZEt|rdQ6bhAgpcLHPz?f-vB?$dc*!9OL?Q8mn7->bFD2Si60* z!O%y)fCdMSV|lkF9w%x~J*A&srMyYY3{=&$}H zGQ4VG_?$2X(0|vT0{=;W$~icCI{b6W{B!Q8xdGhF|D{25G_5_+%s(46lhvNLkik~R z>nr(&C#5wwOzJZQo9m|U<;&Wk!_#q|V>fsmj1g<6%hB{jGoNUPjgJslld>xmODzGjYc?7JSuA?A_QzjDw5AsRgi@Y|Z0{F{!1=!NES-#*f^s4l0Hu zz468))2IY5dmD9pa*(yT5{EyP^G>@ZWumealS-*WeRcZ}B%gxq{MiJ|RyX-^C1V=0 z@iKdrGi1jTe8Ya^x7yyH$kBNvM4R~`fbPq$BzHum-3Zo8C6=KW@||>zsA8-Y9uV5V z#oq-f5L5}V<&wF4@X@<3^C%ptp6+Ce)~hGl`kwj)bsAjmo_GU^r940Z-|`<)oGnh7 zFF0Tde3>ui?8Yj{sF-Z@)yQd~CGZ*w-6p2U<8}JO-sRsVI5dBji`01W8A&3$?}lxBaC&vn0E$c5tW* zX>5(zzZ=qn&!J~KdsPl;P@bmA-Pr8T*)eh_+Dv5=Ma|XSle6t(k8qcgNyar{*ReQ8 zTXwi=8vr>!3Ywr+BhggHDw8ke==NTQVMCK`$69fhzEFB*4+H9LIvdt-#IbhZvpS}} zO3lz;P?zr0*0$%-Rq_y^k(?I{Mk}h@w}cZpMUp|ucs55bcloL2)($u%mXQw({Wzc~ z;6nu5MkjP)0C(@%6Q_I_vsWrfhl7Zpoxw#WoE~r&GOSCz;_ro6i(^hM>I$8y>`!wW z*U^@?B!MMmb89I}2(hcE4zN2G^kwyWCZp5JG>$Ez7zP~D=J^LMjSM)27_0B_X^C(M z`fFT+%DcKlu?^)FCK>QzSnV%IsXVcUFhFdBP!6~se&xxrIxsvySAWu++IrH;FbcY$ z2DWTvSBRfLwdhr0nMx+URA$j3i7_*6BWv#DXfym?ZRDcX9C?cY9sD3q)uBDR3uWg= z(lUIzB)G$Hr!){>E{s4Dew+tb9kvToZp-1&c?y2wn@Z~(VBhqz`cB;{E4(P3N2*nJ z_>~g@;UF2iG{Kt(<1PyePTKahF8<)pozZ*xH~U-kfoAayCwJViIrnqwqO}7{0pHw$ zs2Kx?s#vQr7XZ264>5RNKSL8|Ty^=PsIx^}QqOOcfpGUU4tRkUc|kc7-!Ae6!+B{o~7nFpm3|G5^=0#Bnm6`V}oSQlrX(u%OWnC zoLPy&Q;1Jui&7ST0~#+}I^&?vcE*t47~Xq#YwvA^6^} z`WkC)$AkNub|t@S!$8CBlwbV~?yp&@9h{D|3z-vJXgzRC5^nYm+PyPcgRzAnEi6Q^gslXYRv4nycsy-SJu?lMps-? zV`U*#WnFsdPLL)Q$AmD|0`UaC4ND07+&UmOu!eHruzV|OUox<+Jl|Mr@6~C`T@P%s zW7sgXLF2SSe9Fl^O(I*{9wsFSYb2l%-;&Pi^dpv!{)C3d0AlNY6!4fgmSgj_wQ*7Am7&$z;Jg&wgR-Ih;lUvWS|KTSg!&s_E9_bXBkZvGiC6bFKDWZxsD$*NZ#_8bl zG1P-#@?OQzED7@jlMJTH@V!6k;W>auvft)}g zhoV{7$q=*;=l{O>Q4a@ ziMjf_u*o^PsO)#BjC%0^h>Xp@;5$p{JSYDt)zbb}s{Kbt!T*I@Pk@X0zds6wsefuU zW$XY%yyRGC94=6mf?x+bbA5CDQ2AgW1T-jVAJbm7K(gp+;v6E0WI#kuACgV$r}6L? zd|Tj?^%^*N&b>Dd{Wr$FS2qI#Ucs1yd4N+RBUQiSZGujH`#I)mG&VKoDh=KKFl4=G z&MagXl6*<)$6P}*Tiebpz5L=oMaPrN+caUXRJ`D?=K9!e0f{@D&cZLKN?iNP@X0aF zE(^pl+;*T5qt?1jRC=5PMgV!XNITRLS_=9{CJExaQj;lt!&pdzpK?8p>%Mb+D z?yO*uSung=-`QQ@yX@Hyd4@CI^r{2oiu`%^bNkz+Nkk!IunjwNC|WcqvX~k=><-I3 zDQdbdb|!v+Iz01$w@aMl!R)koD77Xp;eZwzSl-AT zr@Vu{=xvgfq9akRrrM)}=!=xcs+U1JO}{t(avgz`6RqiiX<|hGG1pmop8k6Q+G_mv zJv|RfDheUp2L3=^C=4aCBMBn0aRCU(DQwX-W(RkRwmLeuJYF<0urcaf(=7)JPg<3P zQs!~G)9CT18o!J4{zX{_e}4eS)U-E)0FAt}wEI(c0%HkxgggW;(1E=>J17_hsH^sP z%lT0LGgbUXHx-K*CI-MCrP66UP0PvGqM$MkeLyqHdbgP|_Cm!7te~b8p+e6sQ_3k| zVcwTh6d83ltdnR>D^)BYQpDKlLk3g0Hdcgz2}%qUs9~~Rie)A-BV1mS&naYai#xcZ z(d{8=-LVpTp}2*y)|gR~;qc7fp26}lPcLZ#=JpYcn3AT9(UIdOyg+d(P5T7D&*P}# zQCYplZO5|7+r19%9e`v^vfSS1sbX1c%=w1;oyruXB%Kl$ACgKQ6=qNWLsc=28xJjg zwvsI5-%SGU|3p>&zXVl^vVtQT3o-#$UT9LI@Npz~6=4!>mc431VRNN8od&Ul^+G_kHC`G=6WVWM z%9eWNyy(FTO|A+@x}Ou3CH)oi;t#7rAxdIXfNFwOj_@Y&TGz6P_sqiB`Q6Lxy|Q{`|fgmRG(k+!#b*M+Z9zFce)f-7;?Km5O=LHV9f9_87; zF7%R2B+$?@sH&&-$@tzaPYkw0;=i|;vWdI|Wl3q_Zu>l;XdIw2FjV=;Mq5t1Q0|f< zs08j54Bp`3RzqE=2enlkZxmX6OF+@|2<)A^RNQpBd6o@OXl+i)zO%D4iGiQNuXd+zIR{_lb96{lc~bxsBveIw6umhShTX+3@ZJ=YHh@ zWY3(d0azg;7oHn>H<>?4@*RQbi>SmM=JrHvIG(~BrvI)#W(EAeO6fS+}mxxcc+X~W6&YVl86W9WFSS}Vz-f9vS?XUDBk)3TcF z8V?$4Q)`uKFq>xT=)Y9mMFVTUk*NIA!0$?RP6Ig0TBmUFrq*Q-Agq~DzxjStQyJ({ zBeZ;o5qUUKg=4Hypm|}>>L=XKsZ!F$yNTDO)jt4H0gdQ5$f|d&bnVCMMXhNh)~mN z@_UV6D7MVlsWz+zM+inZZp&P4fj=tm6fX)SG5H>OsQf_I8c~uGCig$GzuwViK54bcgL;VN|FnyQl>Ed7(@>=8$a_UKIz|V6CeVSd2(P z0Uu>A8A+muM%HLFJQ9UZ5c)BSAv_zH#1f02x?h9C}@pN@6{>UiAp>({Fn(T9Q8B z^`zB;kJ5b`>%dLm+Ol}ty!3;8f1XDSVX0AUe5P#@I+FQ-`$(a;zNgz)4x5hz$Hfbg z!Q(z26wHLXko(1`;(BAOg_wShpX0ixfWq3ponndY+u%1gyX)_h=v1zR#V}#q{au6; z!3K=7fQwnRfg6FXtNQmP>`<;!N137paFS%y?;lb1@BEdbvQHYC{976l`cLqn;b8lp zIDY>~m{gDj(wfnK!lpW6pli)HyLEiUrNc%eXTil|F2s(AY+LW5hkKb>TQ3|Q4S9rr zpDs4uK_co6XPsn_z$LeS{K4jFF`2>U`tbgKdyDne`xmR<@6AA+_hPNKCOR-Zqv;xk zu5!HsBUb^!4uJ7v0RuH-7?l?}b=w5lzzXJ~gZcxRKOovSk@|#V+MuX%Y+=;14i*%{)_gSW9(#4%)AV#3__kac1|qUy!uyP{>?U#5wYNq}y$S9pCc zFc~4mgSC*G~j0u#qqp9 z${>3HV~@->GqEhr_Xwoxq?Hjn#=s2;i~g^&Hn|aDKpA>Oc%HlW(KA1?BXqpxB;Ydx)w;2z^MpjJ(Qi(X!$5RC z*P{~%JGDQqojV>2JbEeCE*OEu!$XJ>bWA9Oa_Hd;y)F%MhBRi*LPcdqR8X`NQ&1L# z5#9L*@qxrx8n}LfeB^J{%-?SU{FCwiWyHp682F+|pa+CQa3ZLzBqN1{)h4d6+vBbV zC#NEbQLC;}me3eeYnOG*nXOJZEU$xLZ1<1Y=7r0(-U0P6-AqwMAM`a(Ed#7vJkn6plb4eI4?2y3yOTGmmDQ!z9`wzbf z_OY#0@5=bnep;MV0X_;;SJJWEf^E6Bd^tVJ9znWx&Ks8t*B>AM@?;D4oWUGc z!H*`6d7Cxo6VuyS4Eye&L1ZRhrRmN6Lr`{NL(wDbif|y&z)JN>Fl5#Wi&mMIr5i;x zBx}3YfF>>8EC(fYnmpu~)CYHuHCyr5*`ECap%t@y=jD>!_%3iiE|LN$mK9>- zHdtpy8fGZtkZF?%TW~29JIAfi2jZT8>OA7=h;8T{{k?c2`nCEx9$r zS+*&vt~2o^^J+}RDG@+9&M^K*z4p{5#IEVbz`1%`m5c2};aGt=V?~vIM}ZdPECDI)47|CWBCfDWUbxBCnmYivQ*0Nu_xb*C>~C9(VjHM zxe<*D<#dQ8TlpMX2c@M<9$w!RP$hpG4cs%AI){jp*Sj|*`m)5(Bw*A0$*i-(CA5#%>a)$+jI2C9r6|(>J8InryENI z$NohnxDUB;wAYDwrb*!N3noBTKPpPN}~09SEL18tkG zxgz(RYU_;DPT{l?Q$+eaZaxnsWCA^ds^0PVRkIM%bOd|G2IEBBiz{&^JtNsODs;5z zICt_Zj8wo^KT$7Bg4H+y!Df#3mbl%%?|EXe!&(Vmac1DJ*y~3+kRKAD=Ovde4^^%~ zw<9av18HLyrf*_>Slp;^i`Uy~`mvBjZ|?Ad63yQa#YK`4+c6;pW4?XIY9G1(Xh9WO8{F-Aju+nS9Vmv=$Ac0ienZ+p9*O%NG zMZKy5?%Z6TAJTE?o5vEr0r>f>hb#2w2U3DL64*au_@P!J!TL`oH2r*{>ffu6|A7tv zL4juf$DZ1MW5ZPsG!5)`k8d8c$J$o;%EIL0va9&GzWvkS%ZsGb#S(?{!UFOZ9<$a| zY|a+5kmD5N&{vRqkgY>aHsBT&`rg|&kezoD)gP0fsNYHsO#TRc_$n6Lf1Z{?+DLziXlHrq4sf(!>O{?Tj;Eh@%)+nRE_2VxbN&&%%caU#JDU%vL3}Cb zsb4AazPI{>8H&d=jUaZDS$-0^AxE@utGs;-Ez_F(qC9T=UZX=>ok2k2 ziTn{K?y~a5reD2A)P${NoI^>JXn>`IeArow(41c-Wm~)wiryEP(OS{YXWi7;%dG9v zI?mwu1MxD{yp_rrk!j^cKM)dc4@p4Ezyo%lRN|XyD}}>v=Xoib0gOcdXrQ^*61HNj z=NP|pd>@yfvr-=m{8$3A8TQGMTE7g=z!%yt`8`Bk-0MMwW~h^++;qyUP!J~ykh1GO z(FZ59xuFR$(WE;F@UUyE@Sp>`aVNjyj=Ty>_Vo}xf`e7`F;j-IgL5`1~-#70$9_=uBMq!2&1l zomRgpD58@)YYfvLtPW}{C5B35R;ZVvB<<#)x%srmc_S=A7F@DW8>QOEGwD6suhwCg z>Pa+YyULhmw%BA*4yjDp|2{!T98~<6Yfd(wo1mQ!KWwq0eg+6)o1>W~f~kL<-S+P@$wx*zeI|1t7z#Sxr5 zt6w+;YblPQNplq4Z#T$GLX#j6yldXAqj>4gAnnWtBICUnA&-dtnlh=t0Ho_vEKwV` z)DlJi#!@nkYV#$!)@>udAU*hF?V`2$Hf=V&6PP_|r#Iv*J$9)pF@X3`k;5})9^o4y z&)~?EjX5yX12O(BsFy-l6}nYeuKkiq`u9145&3Ssg^y{5G3Pse z9w(YVa0)N-fLaBq1`P!_#>SS(8fh_5!f{UrgZ~uEdeMJIz7DzI5!NHHqQtm~#CPij z?=N|J>nPR6_sL7!f4hD_|KH`vf8(Wpnj-(gPWH+ZvID}%?~68SwhPTC3u1_cB`otq z)U?6qo!ZLi5b>*KnYHWW=3F!p%h1;h{L&(Q&{qY6)_qxNfbP6E3yYpW!EO+IW3?@J z);4>g4gnl^8klu7uA>eGF6rIGSynacogr)KUwE_R4E5Xzi*Qir@b-jy55-JPC8c~( zo!W8y9OGZ&`xmc8;=4-U9=h{vCqfCNzYirONmGbRQlR`WWlgnY+1wCXbMz&NT~9*| z6@FrzP!LX&{no2!Ln_3|I==_4`@}V?4a;YZKTdw;vT<+K+z=uWbW(&bXEaWJ^W8Td z-3&1bY^Z*oM<=M}LVt>_j+p=2Iu7pZmbXrhQ_k)ysE9yXKygFNw$5hwDn(M>H+e1&9BM5!|81vd%r%vEm zqxY3?F@fb6O#5UunwgAHR9jp_W2zZ}NGp2%mTW@(hz7$^+a`A?mb8|_G*GNMJ) zjqegXQio=i@AINre&%ofexAr95aop5C+0MZ0m-l=MeO8m3epm7U%vZB8+I+C*iNFM z#T3l`gknX;D$-`2XT^Cg*vrv=RH+P;_dfF++cP?B_msQI4j+lt&rX2)3GaJx%W*Nn zkML%D{z5tpHH=dksQ*gzc|}gzW;lwAbxoR07VNgS*-c3d&8J|;@3t^ zVUz*J*&r7DFRuFVDCJDK8V9NN5hvpgGjwx+5n)qa;YCKe8TKtdnh{I7NU9BCN!0dq zczrBk8pE{{@vJa9ywR@mq*J=v+PG;?fwqlJVhijG!3VmIKs>9T6r7MJpC)m!Tc#>g zMtVsU>wbwFJEfwZ{vB|ZlttNe83)$iz`~#8UJ^r)lJ@HA&G#}W&ZH*;k{=TavpjWE z7hdyLZPf*X%Gm}i`Y{OGeeu^~nB8=`{r#TUrM-`;1cBvEd#d!kPqIgYySYhN-*1;L z^byj%Yi}Gx)Wnkosi337BKs}+5H5dth1JA{Ir-JKN$7zC)*}hqeoD(WfaUDPT>0`- z(6sa0AoIqASwF`>hP}^|)a_j2s^PQn*qVC{Q}htR z5-)duBFXT_V56-+UohKXlq~^6uf!6sA#ttk1o~*QEy_Y-S$gAvq47J9Vtk$5oA$Ct zYhYJ@8{hsC^98${!#Ho?4y5MCa7iGnfz}b9jE~h%EAAv~Qxu)_rAV;^cygV~5r_~?l=B`zObj7S=H=~$W zPtI_m%g$`kL_fVUk9J@>EiBH zOO&jtn~&`hIFMS5S`g8w94R4H40mdNUH4W@@XQk1sr17b{@y|JB*G9z1|CrQjd+GX z6+KyURG3;!*BQrentw{B2R&@2&`2}n(z-2&X7#r!{yg@Soy}cRD~j zj9@UBW+N|4HW4AWapy4wfUI- zZ`gSL6DUlgj*f1hSOGXG0IVH8HxK?o2|3HZ;KW{K+yPAlxtb)NV_2AwJm|E)FRs&& z=c^e7bvUsztY|+f^k7NXs$o1EUq>cR7C0$UKi6IooHWlK_#?IWDkvywnzg&ThWo^? z2O_N{5X39#?eV9l)xI(>@!vSB{DLt*oY!K1R8}_?%+0^C{d9a%N4 zoxHVT1&Lm|uDX%$QrBun5e-F`HJ^T$ zmzv)p@4ZHd_w9!%Hf9UYNvGCw2TTTbrj9pl+T9%-_-}L(tES>Or-}Z4F*{##n3~L~TuxjirGuIY#H7{%$E${?p{Q01 zi6T`n;rbK1yIB9jmQNycD~yZq&mbIsFWHo|ZAChSFPQa<(%d8mGw*V3fh|yFoxOOiWJd(qvVb!Z$b88cg->N=qO*4k~6;R==|9ihg&riu#P~s4Oap9O7f%crSr^rljeIfXDEg>wi)&v*a%7zpz<9w z*r!3q9J|390x`Zk;g$&OeN&ctp)VKRpDSV@kU2Q>jtok($Y-*x8_$2piTxun81@vt z!Vj?COa0fg2RPXMSIo26T=~0d`{oGP*eV+$!0I<(4azk&Vj3SiG=Q!6mX0p$z7I}; z9BJUFgT-K9MQQ-0@Z=^7R<{bn2Fm48endsSs`V7_@%8?Bxkqv>BDoVcj?K#dV#uUP zL1ND~?D-|VGKe3Rw_7-Idpht>H6XRLh*U7epS6byiGvJpr%d}XwfusjH9g;Z98H`x zyde%%5mhGOiL4wljCaWCk-&uE4_OOccb9c!ZaWt4B(wYl!?vyzl%7n~QepN&eFUrw zFIOl9c({``6~QD+43*_tzP{f2x41h(?b43^y6=iwyB)2os5hBE!@YUS5?N_tXd=h( z)WE286Fbd>R4M^P{!G)f;h<3Q>Fipuy+d2q-)!RyTgt;wr$(?9ox3;q+{E*ZQHhOn;lM`cjnu9 zXa48ks-v(~b*;MAI<>YZH(^NV8vjb34beE<_cwKlJoR;k6lJNSP6v}uiyRD?|0w+X@o1ONrH8a$fCxXpf? z?$DL0)7|X}Oc%h^zrMKWc-NS9I0Utu@>*j}b@tJ=ixQSJ={4@854wzW@E>VSL+Y{i z#0b=WpbCZS>kUCO_iQz)LoE>P5LIG-hv9E+oG}DtlIDF>$tJ1aw9^LuhLEHt?BCj& z(O4I8v1s#HUi5A>nIS-JK{v!7dJx)^Yg%XjNmlkWAq2*cv#tHgz`Y(bETc6CuO1VkN^L-L3j_x<4NqYb5rzrLC-7uOv z!5e`GZt%B782C5-fGnn*GhDF$%(qP<74Z}3xx+{$4cYKy2ikxI7B2N+2r07DN;|-T->nU&!=Cm#rZt%O_5c&1Z%nlWq3TKAW0w zQqemZw_ue--2uKQsx+niCUou?HjD`xhEjjQd3%rrBi82crq*~#uA4+>vR<_S{~5ce z-2EIl?~s z1=GVL{NxP1N3%=AOaC}j_Fv=ur&THz zyO!d9kHq|c73kpq`$+t+8Bw7MgeR5~`d7ChYyGCBWSteTB>8WAU(NPYt2Dk`@#+}= zI4SvLlyk#pBgVigEe`?NG*vl7V6m+<}%FwPV=~PvvA)=#ths==DRTDEYh4V5}Cf$z@#;< zyWfLY_5sP$gc3LLl2x+Ii)#b2nhNXJ{R~vk`s5U7Nyu^3yFg&D%Txwj6QezMX`V(x z=C`{76*mNb!qHHs)#GgGZ_7|vkt9izl_&PBrsu@}L`X{95-2jf99K)0=*N)VxBX2q z((vkpP2RneSIiIUEnGb?VqbMb=Zia+rF~+iqslydE34cSLJ&BJW^3knX@M;t*b=EA zNvGzv41Ld_T+WT#XjDB840vovUU^FtN_)G}7v)1lPetgpEK9YS^OWFkPoE{ovj^=@ zO9N$S=G$1ecndT_=5ehth2Lmd1II-PuT~C9`XVePw$y8J#dpZ?Tss<6wtVglm(Ok7 z3?^oi@pPio6l&!z8JY(pJvG=*pI?GIOu}e^EB6QYk$#FJQ%^AIK$I4epJ+9t?KjqA+bkj&PQ*|vLttme+`9G=L% ziadyMw_7-M)hS(3E$QGNCu|o23|%O+VN7;Qggp?PB3K-iSeBa2b}V4_wY`G1Jsfz4 z9|SdB^;|I8E8gWqHKx!vj_@SMY^hLEIbSMCuE?WKq=c2mJK z8LoG-pnY!uhqFv&L?yEuxo{dpMTsmCn)95xanqBrNPTgXP((H$9N${Ow~Is-FBg%h z53;|Y5$MUN)9W2HBe2TD`ct^LHI<(xWrw}$qSoei?}s)&w$;&!14w6B6>Yr6Y8b)S z0r71`WmAvJJ`1h&poLftLUS6Ir zC$bG9!Im_4Zjse)#K=oJM9mHW1{%l8sz$1o?ltdKlLTxWWPB>Vk22czVt|1%^wnN@*!l)}?EgtvhC>vlHm^t+ogpgHI1_$1ox9e;>0!+b(tBrmXRB`PY1vp-R**8N7 zGP|QqI$m(Rdu#=(?!(N}G9QhQ%o!aXE=aN{&wtGP8|_qh+7a_j_sU5|J^)vxq;# zjvzLn%_QPHZZIWu1&mRAj;Sa_97p_lLq_{~j!M9N^1yp3U_SxRqK&JnR%6VI#^E12 z>CdOVI^_9aPK2eZ4h&^{pQs}xsijXgFYRIxJ~N7&BB9jUR1fm!(xl)mvy|3e6-B3j zJn#ajL;bFTYJ2+Q)tDjx=3IklO@Q+FFM}6UJr6km7hj7th9n_&JR7fnqC!hTZoM~T zBeaVFp%)0cbPhejX<8pf5HyRUj2>aXnXBqDJe73~J%P(2C?-RT{c3NjE`)om! zl$uewSgWkE66$Kb34+QZZvRn`fob~Cl9=cRk@Es}KQm=?E~CE%spXaMO6YmrMl%9Q zlA3Q$3|L1QJ4?->UjT&CBd!~ru{Ih^in&JXO=|<6J!&qp zRe*OZ*cj5bHYlz!!~iEKcuE|;U4vN1rk$xq6>bUWD*u(V@8sG^7>kVuo(QL@Ki;yL zWC!FT(q{E8#on>%1iAS0HMZDJg{Z{^!De(vSIq&;1$+b)oRMwA3nc3mdTSG#3uYO_ z>+x;7p4I;uHz?ZB>dA-BKl+t-3IB!jBRgdvAbW!aJ(Q{aT>+iz?91`C-xbe)IBoND z9_Xth{6?(y3rddwY$GD65IT#f3<(0o#`di{sh2gm{dw*#-Vnc3r=4==&PU^hCv$qd zjw;>i&?L*Wq#TxG$mFIUf>eK+170KG;~+o&1;Tom9}}mKo23KwdEM6UonXgc z!6N(@k8q@HPw{O8O!lAyi{rZv|DpgfU{py+j(X_cwpKqcalcqKIr0kM^%Br3SdeD> zHSKV94Yxw;pjzDHo!Q?8^0bb%L|wC;4U^9I#pd5O&eexX+Im{ z?jKnCcsE|H?{uGMqVie_C~w7GX)kYGWAg%-?8|N_1#W-|4F)3YTDC+QSq1s!DnOML3@d`mG%o2YbYd#jww|jD$gotpa)kntakp#K;+yo-_ZF9qrNZw<%#C zuPE@#3RocLgPyiBZ+R_-FJ_$xP!RzWm|aN)S+{$LY9vvN+IW~Kf3TsEIvP+B9Mtm! zpfNNxObWQpLoaO&cJh5>%slZnHl_Q~(-Tfh!DMz(dTWld@LG1VRF`9`DYKhyNv z2pU|UZ$#_yUx_B_|MxUq^glT}O5Xt(Vm4Mr02><%C)@v;vPb@pT$*yzJ4aPc_FZ3z z3}PLoMBIM>q_9U2rl^sGhk1VUJ89=*?7|v`{!Z{6bqFMq(mYiA?%KbsI~JwuqVA9$H5vDE+VocjX+G^%bieqx->s;XWlKcuv(s%y%D5Xbc9+ zc(_2nYS1&^yL*ey664&4`IoOeDIig}y-E~_GS?m;D!xv5-xwz+G`5l6V+}CpeJDi^ z%4ed$qowm88=iYG+(`ld5Uh&>Dgs4uPHSJ^TngXP_V6fPyl~>2bhi20QB%lSd#yYn zO05?KT1z@?^-bqO8Cg`;ft>ilejsw@2%RR7;`$Vs;FmO(Yr3Fp`pHGr@P2hC%QcA|X&N2Dn zYf`MqXdHi%cGR@%y7Rg7?d3?an){s$zA{!H;Ie5exE#c~@NhQUFG8V=SQh%UxUeiV zd7#UcYqD=lk-}sEwlpu&H^T_V0{#G?lZMxL7ih_&{(g)MWBnCZxtXg znr#}>U^6!jA%e}@Gj49LWG@*&t0V>Cxc3?oO7LSG%~)Y5}f7vqUUnQ;STjdDU}P9IF9d9<$;=QaXc zL1^X7>fa^jHBu_}9}J~#-oz3Oq^JmGR#?GO7b9a(=R@fw@}Q{{@`Wy1vIQ#Bw?>@X z-_RGG@wt|%u`XUc%W{J z>iSeiz8C3H7@St3mOr_mU+&bL#Uif;+Xw-aZdNYUpdf>Rvu0i0t6k*}vwU`XNO2he z%miH|1tQ8~ZK!zmL&wa3E;l?!!XzgV#%PMVU!0xrDsNNZUWKlbiOjzH-1Uoxm8E#r`#2Sz;-o&qcqB zC-O_R{QGuynW14@)7&@yw1U}uP(1cov)twxeLus0s|7ayrtT8c#`&2~Fiu2=R;1_4bCaD=*E@cYI>7YSnt)nQc zohw5CsK%m?8Ack)qNx`W0_v$5S}nO|(V|RZKBD+btO?JXe|~^Qqur%@eO~<8-L^9d z=GA3-V14ng9L29~XJ>a5k~xT2152zLhM*@zlp2P5Eu}bywkcqR;ISbas&#T#;HZSf z2m69qTV(V@EkY(1Dk3`}j)JMo%ZVJ*5eB zYOjIisi+igK0#yW*gBGj?@I{~mUOvRFQR^pJbEbzFxTubnrw(Muk%}jI+vXmJ;{Q6 zrSobKD>T%}jV4Ub?L1+MGOD~0Ir%-`iTnWZN^~YPrcP5y3VMAzQ+&en^VzKEb$K!Q z<7Dbg&DNXuow*eD5yMr+#08nF!;%4vGrJI++5HdCFcGLfMW!KS*Oi@=7hFwDG!h2< zPunUEAF+HncQkbfFj&pbzp|MU*~60Z(|Ik%Tn{BXMN!hZOosNIseT?R;A`W?=d?5X zK(FB=9mZusYahp|K-wyb={rOpdn=@;4YI2W0EcbMKyo~-#^?h`BA9~o285%oY zfifCh5Lk$SY@|2A@a!T2V+{^!psQkx4?x0HSV`(w9{l75QxMk!)U52Lbhn{8ol?S) zCKo*7R(z!uk<6*qO=wh!Pul{(qq6g6xW;X68GI_CXp`XwO zxuSgPRAtM8K7}5E#-GM!*ydOOG_{A{)hkCII<|2=ma*71ci_-}VPARm3crFQjLYV! z9zbz82$|l01mv`$WahE2$=fAGWkd^X2kY(J7iz}WGS z@%MyBEO=A?HB9=^?nX`@nh;7;laAjs+fbo!|K^mE!tOB>$2a_O0y-*uaIn8k^6Y zSbuv;5~##*4Y~+y7Z5O*3w4qgI5V^17u*ZeupVGH^nM&$qmAk|anf*>r zWc5CV;-JY-Z@Uq1Irpb^O`L_7AGiqd*YpGUShb==os$uN3yYvb`wm6d=?T*it&pDk zo`vhw)RZX|91^^Wa_ti2zBFyWy4cJu#g)_S6~jT}CC{DJ_kKpT`$oAL%b^!2M;JgT zM3ZNbUB?}kP(*YYvXDIH8^7LUxz5oE%kMhF!rnPqv!GiY0o}NR$OD=ITDo9r%4E>E0Y^R(rS^~XjWyVI6 zMOR5rPXhTp*G*M&X#NTL`Hu*R+u*QNoiOKg4CtNPrjgH>c?Hi4MUG#I917fx**+pJfOo!zFM&*da&G_x)L(`k&TPI*t3e^{crd zX<4I$5nBQ8Ax_lmNRa~E*zS-R0sxkz`|>7q_?*e%7bxqNm3_eRG#1ae3gtV9!fQpY z+!^a38o4ZGy9!J5sylDxZTx$JmG!wg7;>&5H1)>f4dXj;B+@6tMlL=)cLl={jLMxY zbbf1ax3S4>bwB9-$;SN2?+GULu;UA-35;VY*^9Blx)Jwyb$=U!D>HhB&=jSsd^6yw zL)?a|>GxU!W}ocTC(?-%z3!IUhw^uzc`Vz_g>-tv)(XA#JK^)ZnC|l1`@CdX1@|!| z_9gQ)7uOf?cR@KDp97*>6X|;t@Y`k_N@)aH7gY27)COv^P3ya9I{4z~vUjLR9~z1Z z5=G{mVtKH*&$*t0@}-i_v|3B$AHHYale7>E+jP`ClqG%L{u;*ff_h@)al?RuL7tOO z->;I}>%WI{;vbLP3VIQ^iA$4wl6@0sDj|~112Y4OFjMs`13!$JGkp%b&E8QzJw_L5 zOnw9joc0^;O%OpF$Qp)W1HI!$4BaXX84`%@#^dk^hFp^pQ@rx4g(8Xjy#!X%+X5Jd@fs3amGT`}mhq#L97R>OwT5-m|h#yT_-v@(k$q7P*9X~T*3)LTdzP!*B} z+SldbVWrrwQo9wX*%FyK+sRXTa@O?WM^FGWOE?S`R(0P{<6p#f?0NJvnBia?k^fX2 zNQs7K-?EijgHJY}&zsr;qJ<*PCZUd*x|dD=IQPUK_nn)@X4KWtqoJNHkT?ZWL_hF? zS8lp2(q>;RXR|F;1O}EE#}gCrY~#n^O`_I&?&z5~7N;zL0)3Tup`%)oHMK-^r$NT% zbFg|o?b9w(q@)6w5V%si<$!U<#}s#x@0aX-hP>zwS#9*75VXA4K*%gUc>+yzupTDBOKH8WR4V0pM(HrfbQ&eJ79>HdCvE=F z|J>s;;iDLB^3(9}?biKbxf1$lI!*Z%*0&8UUq}wMyPs_hclyQQi4;NUY+x2qy|0J; zhn8;5)4ED1oHwg+VZF|80<4MrL97tGGXc5Sw$wAI#|2*cvQ=jB5+{AjMiDHmhUC*a zlmiZ`LAuAn_}hftXh;`Kq0zblDk8?O-`tnilIh|;3lZp@F_osJUV9`*R29M?7H{Fy z`nfVEIDIWXmU&YW;NjU8)EJpXhxe5t+scf|VXM!^bBlwNh)~7|3?fWwo_~ZFk(22% zTMesYw+LNx3J-_|DM~`v93yXe=jPD{q;li;5PD?Dyk+b? zo21|XpT@)$BM$%F=P9J19Vi&1#{jM3!^Y&fr&_`toi`XB1!n>sbL%U9I5<7!@?t)~ z;&H%z>bAaQ4f$wIzkjH70;<8tpUoxzKrPhn#IQfS%9l5=Iu))^XC<58D!-O z{B+o5R^Z21H0T9JQ5gNJnqh#qH^na|z92=hONIM~@_iuOi|F>jBh-?aA20}Qx~EpDGElELNn~|7WRXRFnw+Wdo`|# zBpU=Cz3z%cUJ0mx_1($X<40XEIYz(`noWeO+x#yb_pwj6)R(__%@_Cf>txOQ74wSJ z0#F3(zWWaR-jMEY$7C*3HJrohc79>MCUu26mfYN)f4M~4gD`}EX4e}A!U}QV8!S47 z6y-U-%+h`1n`*pQuKE%Av0@)+wBZr9mH}@vH@i{v(m-6QK7Ncf17x_D=)32`FOjjo zg|^VPf5c6-!FxN{25dvVh#fog=NNpXz zfB$o+0jbRkHH{!TKhE709f+jI^$3#v1Nmf80w`@7-5$1Iv_`)W^px8P-({xwb;D0y z7LKDAHgX<84?l!I*Dvi2#D@oAE^J|g$3!)x1Ua;_;<@#l1fD}lqU2_tS^6Ht$1Wl} zBESo7o^)9-Tjuz$8YQSGhfs{BQV6zW7dA?0b(Dbt=UnQs&4zHfe_sj{RJ4uS-vQpC zX;Bbsuju4%!o8?&m4UZU@~ZZjeFF6ex2ss5_60_JS_|iNc+R0GIjH1@Z z=rLT9%B|WWgOrR7IiIwr2=T;Ne?30M!@{%Qf8o`!>=s<2CBpCK_TWc(DX51>e^xh8 z&@$^b6CgOd7KXQV&Y4%}_#uN*mbanXq(2=Nj`L7H7*k(6F8s6{FOw@(DzU`4-*77{ zF+dxpv}%mFpYK?>N_2*#Y?oB*qEKB}VoQ@bzm>ptmVS_EC(#}Lxxx730trt0G)#$b zE=wVvtqOct1%*9}U{q<)2?{+0TzZzP0jgf9*)arV)*e!f`|jgT{7_9iS@e)recI#z zbzolURQ+TOzE!ymqvBY7+5NnAbWxvMLsLTwEbFqW=CPyCsmJ}P1^V30|D5E|p3BC5 z)3|qgw@ra7aXb-wsa|l^in~1_fm{7bS9jhVRkYVO#U{qMp z)Wce+|DJ}4<2gp8r0_xfZpMo#{Hl2MfjLcZdRB9(B(A(f;+4s*FxV{1F|4d`*sRNd zp4#@sEY|?^FIJ;tmH{@keZ$P(sLh5IdOk@k^0uB^BWr@pk6mHy$qf&~rI>P*a;h0C{%oA*i!VjWn&D~O#MxN&f@1Po# zKN+ zrGrkSjcr?^R#nGl<#Q722^wbYcgW@{+6CBS<1@%dPA8HC!~a`jTz<`g_l5N1M@9wn9GOAZ>nqNgq!yOCbZ@1z`U_N`Z>}+1HIZxk*5RDc&rd5{3qjRh8QmT$VyS;jK z;AF+r6XnnCp=wQYoG|rT2@8&IvKq*IB_WvS%nt%e{MCFm`&W*#LXc|HrD?nVBo=(8*=Aq?u$sDA_sC_RPDUiQ+wnIJET8vx$&fxkW~kP9qXKt zozR)@xGC!P)CTkjeWvXW5&@2?)qt)jiYWWBU?AUtzAN}{JE1I)dfz~7$;}~BmQF`k zpn11qmObXwRB8&rnEG*#4Xax3XBkKlw(;tb?Np^i+H8m(Wyz9k{~ogba@laiEk;2! zV*QV^6g6(QG%vX5Um#^sT&_e`B1pBW5yVth~xUs#0}nv?~C#l?W+9Lsb_5)!71rirGvY zTIJ$OPOY516Y|_014sNv+Z8cc5t_V=i>lWV=vNu#!58y9Zl&GsMEW#pPYPYGHQ|;vFvd*9eM==$_=vc7xnyz0~ zY}r??$<`wAO?JQk@?RGvkWVJlq2dk9vB(yV^vm{=NVI8dhsX<)O(#nr9YD?I?(VmQ z^r7VfUBn<~p3()8yOBjm$#KWx!5hRW)5Jl7wY@ky9lNM^jaT##8QGVsYeaVywmpv>X|Xj7gWE1Ezai&wVLt3p)k4w~yrskT-!PR!kiyQlaxl(( zXhF%Q9x}1TMt3~u@|#wWm-Vq?ZerK={8@~&@9r5JW}r#45#rWii};t`{5#&3$W)|@ zbAf2yDNe0q}NEUvq_Quq3cTjcw z@H_;$hu&xllCI9CFDLuScEMg|x{S7GdV8<&Mq=ezDnRZAyX-8gv97YTm0bg=d)(>N z+B2FcqvI9>jGtnK%eO%y zoBPkJTk%y`8TLf4)IXPBn`U|9>O~WL2C~C$z~9|0m*YH<-vg2CD^SX#&)B4ngOSG$ zV^wmy_iQk>dfN@Pv(ckfy&#ak@MLC7&Q6Ro#!ezM*VEh`+b3Jt%m(^T&p&WJ2Oqvj zs-4nq0TW6cv~(YI$n0UkfwN}kg3_fp?(ijSV#tR9L0}l2qjc7W?i*q01=St0eZ=4h zyGQbEw`9OEH>NMuIe)hVwYHsGERWOD;JxEiO7cQv%pFCeR+IyhwQ|y@&^24k+|8fD zLiOWFNJ2&vu2&`Jv96_z-Cd5RLgmeY3*4rDOQo?Jm`;I_(+ejsPM03!ly!*Cu}Cco zrQSrEDHNyzT(D5s1rZq!8#?f6@v6dB7a-aWs(Qk>N?UGAo{gytlh$%_IhyL7h?DLXDGx zgxGEBQoCAWo-$LRvM=F5MTle`M})t3vVv;2j0HZY&G z22^iGhV@uaJh(XyyY%} zd4iH_UfdV#T=3n}(Lj^|n;O4|$;xhu*8T3hR1mc_A}fK}jfZ7LX~*n5+`8N2q#rI$ z@<_2VANlYF$vIH$ zl<)+*tIWW78IIINA7Rr7i{<;#^yzxoLNkXL)eSs=%|P>$YQIh+ea_3k z_s7r4%j7%&*NHSl?R4k%1>Z=M9o#zxY!n8sL5>BO-ZP;T3Gut>iLS@U%IBrX6BA3k z)&@q}V8a{X<5B}K5s(c(LQ=%v1ocr`t$EqqY0EqVjr65usa=0bkf|O#ky{j3)WBR(((L^wmyHRzoWuL2~WTC=`yZ zn%VX`L=|Ok0v7?s>IHg?yArBcync5rG#^+u)>a%qjES%dRZoIyA8gQ;StH z1Ao7{<&}6U=5}4v<)1T7t!J_CL%U}CKNs-0xWoTTeqj{5{?Be$L0_tk>M9o8 zo371}S#30rKZFM{`H_(L`EM9DGp+Mifk&IP|C2Zu_)Ghr4Qtpmkm1osCf@%Z$%t+7 zYH$Cr)Ro@3-QDeQJ8m+x6%;?YYT;k6Z0E-?kr>x33`H%*ueBD7Zx~3&HtWn0?2Wt} zTG}*|v?{$ajzt}xPzV%lL1t-URi8*Zn)YljXNGDb>;!905Td|mpa@mHjIH%VIiGx- zd@MqhpYFu4_?y5N4xiHn3vX&|e6r~Xt> zZG`aGq|yTNjv;9E+Txuoa@A(9V7g?1_T5FzRI;!=NP1Kqou1z5?%X~Wwb{trRfd>i z8&y^H)8YnKyA_Fyx>}RNmQIczT?w2J4SNvI{5J&}Wto|8FR(W;Qw#b1G<1%#tmYzQ zQ2mZA-PAdi%RQOhkHy9Ea#TPSw?WxwL@H@cbkZwIq0B!@ns}niALidmn&W?!Vd4Gj zO7FiuV4*6Mr^2xlFSvM;Cp_#r8UaqIzHJQg_z^rEJw&OMm_8NGAY2)rKvki|o1bH~ z$2IbfVeY2L(^*rMRU1lM5Y_sgrDS`Z??nR2lX;zyR=c%UyGb*%TC-Dil?SihkjrQy~TMv6;BMs7P8il`H7DmpVm@rJ;b)hW)BL)GjS154b*xq-NXq2cwE z^;VP7ua2pxvCmxrnqUYQMH%a%nHmwmI33nJM(>4LznvY*k&C0{8f*%?zggpDgkuz&JBx{9mfb@wegEl2v!=}Sq2Gaty0<)UrOT0{MZtZ~j5y&w zXlYa_jY)I_+VA-^#mEox#+G>UgvM!Ac8zI<%JRXM_73Q!#i3O|)lOP*qBeJG#BST0 zqohi)O!|$|2SeJQo(w6w7%*92S})XfnhrH_Z8qe!G5>CglP=nI7JAOW?(Z29;pXJ9 zR9`KzQ=WEhy*)WH>$;7Cdz|>*i>=##0bB)oU0OR>>N<21e4rMCHDemNi2LD>Nc$;& zQRFthpWniC1J6@Zh~iJCoLOxN`oCKD5Q4r%ynwgUKPlIEd#?QViIqovY|czyK8>6B zSP%{2-<;%;1`#0mG^B(8KbtXF;Nf>K#Di72UWE4gQ%(_26Koiad)q$xRL~?pN71ZZ zujaaCx~jXjygw;rI!WB=xrOJO6HJ!!w}7eiivtCg5K|F6$EXa)=xUC za^JXSX98W`7g-tm@uo|BKj39Dl;sg5ta;4qjo^pCh~{-HdLl6qI9Ix6f$+qiZ$}s= zNguKrU;u+T@ko(Vr1>)Q%h$?UKXCY>3se%&;h2osl2D zE4A9bd7_|^njDd)6cI*FupHpE3){4NQ*$k*cOWZ_?CZ>Z4_fl@n(mMnYK62Q1d@+I zr&O))G4hMihgBqRIAJkLdk(p(D~X{-oBUA+If@B}j& zsHbeJ3RzTq96lB7d($h$xTeZ^gP0c{t!Y0c)aQE;$FY2!mACg!GDEMKXFOPI^)nHZ z`aSPJpvV0|bbrzhWWkuPURlDeN%VT8tndV8?d)eN*i4I@u zVKl^6{?}A?P)Fsy?3oi#clf}L18t;TjNI2>eI&(ezDK7RyqFxcv%>?oxUlonv(px) z$vnPzRH`y5A(x!yOIfL0bmgeMQB$H5wenx~!ujQK*nUBW;@Em&6Xv2%s(~H5WcU2R z;%Nw<$tI)a`Ve!>x+qegJnQsN2N7HaKzrFqM>`6R*gvh%O*-%THt zrB$Nk;lE;z{s{r^PPm5qz(&lM{sO*g+W{sK+m3M_z=4=&CC>T`{X}1Vg2PEfSj2x_ zmT*(x;ov%3F?qoEeeM>dUn$a*?SIGyO8m806J1W1o+4HRhc2`9$s6hM#qAm zChQ87b~GEw{ADfs+5}FJ8+|bIlIv(jT$Ap#hSHoXdd9#w<#cA<1Rkq^*EEkknUd4& zoIWIY)sAswy6fSERVm&!SO~#iN$OgOX*{9@_BWFyJTvC%S++ilSfCrO(?u=Dc?CXZ zzCG&0yVR{Z`|ZF0eEApWEo#s9osV>F{uK{QA@BES#&;#KsScf>y zvs?vIbI>VrT<*!;XmQS=bhq%46-aambZ(8KU-wOO2=en~D}MCToB_u;Yz{)1ySrPZ z@=$}EvjTdzTWU7c0ZI6L8=yP+YRD_eMMos}b5vY^S*~VZysrkq<`cK3>>v%uy7jgq z0ilW9KjVDHLv0b<1K_`1IkbTOINs0=m-22c%M~l=^S}%hbli-3?BnNq?b`hx^HX2J zIe6ECljRL0uBWb`%{EA=%!i^4sMcj+U_TaTZRb+~GOk z^ZW!nky0n*Wb*r+Q|9H@ml@Z5gU&W`(z4-j!OzC1wOke`TRAYGZVl$PmQ16{3196( zO*?`--I}Qf(2HIwb2&1FB^!faPA2=sLg(@6P4mN)>Dc3i(B0;@O-y2;lM4akD>@^v z=u>*|!s&9zem70g7zfw9FXl1bpJW(C#5w#uy5!V?Q(U35A~$dR%LDVnq@}kQm13{} zd53q3N(s$Eu{R}k2esbftfjfOITCL;jWa$}(mmm}d(&7JZ6d3%IABCapFFYjdEjdK z&4Edqf$G^MNAtL=uCDRs&Fu@FXRgX{*0<(@c3|PNHa>L%zvxWS={L8%qw`STm+=Rd zA}FLspESSIpE_^41~#5yI2bJ=9`oc;GIL!JuW&7YetZ?0H}$$%8rW@*J37L-~Rsx!)8($nI4 zZhcZ2^=Y+p4YPl%j!nFJA|*M^gc(0o$i3nlphe+~-_m}jVkRN{spFs(o0ajW@f3K{ zDV!#BwL322CET$}Y}^0ixYj2w>&Xh12|R8&yEw|wLDvF!lZ#dOTHM9pK6@Nm-@9Lnng4ZHBgBSrr7KI8YCC9DX5Kg|`HsiwJHg2(7#nS;A{b3tVO?Z% za{m5b3rFV6EpX;=;n#wltDv1LE*|g5pQ+OY&*6qCJZc5oDS6Z6JD#6F)bWxZSF@q% z+1WV;m!lRB!n^PC>RgQCI#D1br_o^#iPk>;K2hB~0^<~)?p}LG%kigm@moD#q3PE+ zA^Qca)(xnqw6x>XFhV6ku9r$E>bWNrVH9fum0?4s?Rn2LG{Vm_+QJHse6xa%nzQ?k zKug4PW~#Gtb;#5+9!QBgyB@q=sk9=$S{4T>wjFICStOM?__fr+Kei1 z3j~xPqW;W@YkiUM;HngG!;>@AITg}vAE`M2Pj9Irl4w1fo4w<|Bu!%rh%a(Ai^Zhi zs92>v5;@Y(Zi#RI*ua*h`d_7;byQSa*v9E{2x$<-_=5Z<7{%)}4XExANcz@rK69T0x3%H<@frW>RA8^swA+^a(FxK| zFl3LD*ImHN=XDUkrRhp6RY5$rQ{bRgSO*(vEHYV)3Mo6Jy3puiLmU&g82p{qr0F?ohmbz)f2r{X2|T2 z$4fdQ=>0BeKbiVM!e-lIIs8wVTuC_m7}y4A_%ikI;Wm5$9j(^Y z(cD%U%k)X>_>9~t8;pGzL6L-fmQO@K; zo&vQzMlgY95;1BSkngY)e{`n0!NfVgf}2mB3t}D9@*N;FQ{HZ3Pb%BK6;5#-O|WI( zb6h@qTLU~AbVW#_6?c!?Dj65Now7*pU{h!1+eCV^KCuPAGs28~3k@ueL5+u|Z-7}t z9|lskE`4B7W8wMs@xJa{#bsCGDFoRSNSnmNYB&U7 zVGKWe%+kFB6kb)e;TyHfqtU6~fRg)f|>=5(N36)0+C z`hv65J<$B}WUc!wFAb^QtY31yNleq4dzmG`1wHTj=c*=hay9iD071Hc?oYoUk|M*_ zU1GihAMBsM@5rUJ(qS?9ZYJ6@{bNqJ`2Mr+5#hKf?doa?F|+^IR!8lq9)wS3tF_9n zW_?hm)G(M+MYb?V9YoX^_mu5h-LP^TL^!Q9Z7|@sO(rg_4+@=PdI)WL(B7`!K^ND- z-uIuVDCVEdH_C@c71YGYT^_Scf_dhB8Z2Xy6vGtBSlYud9vggOqv^L~F{BraSE_t} zIkP+Hp2&nH^-MNEs}^`oMLy11`PQW$T|K(`Bu*(f@)mv1-qY(_YG&J2M2<7k;;RK~ zL{Fqj9yCz8(S{}@c)S!65aF<=&eLI{hAMErCx&>i7OeDN>okvegO87OaG{Jmi<|}D zaT@b|0X{d@OIJ7zvT>r+eTzgLq~|Dpu)Z&db-P4z*`M$UL51lf>FLlq6rfG)%doyp z)3kk_YIM!03eQ8Vu_2fg{+osaEJPtJ-s36R+5_AEG12`NG)IQ#TF9c@$99%0iye+ zUzZ57=m2)$D(5Nx!n)=5Au&O0BBgwxIBaeI(mro$#&UGCr<;C{UjJVAbVi%|+WP(a zL$U@TYCxJ=1{Z~}rnW;7UVb7+ZnzgmrogDxhjLGo>c~MiJAWs&&;AGg@%U?Y^0JhL ze(x6Z74JG6FlOFK(T}SXQfhr}RIFl@QXKnIcXYF)5|V~e-}suHILKT-k|<*~Ij|VF zC;t@=uj=hot~*!C68G8hTA%8SzOfETOXQ|3FSaIEjvBJp(A)7SWUi5!Eu#yWgY+;n zlm<$+UDou*V+246_o#V4kMdto8hF%%Lki#zPh}KYXmMf?hrN0;>Mv%`@{0Qn`Ujp) z=lZe+13>^Q!9zT);H<(#bIeRWz%#*}sgUX9P|9($kexOyKIOc`dLux}c$7It4u|Rl z6SSkY*V~g_B-hMPo_ak>>z@AVQ(_N)VY2kB3IZ0G(iDUYw+2d7W^~(Jq}KY=JnWS( z#rzEa&0uNhJ>QE8iiyz;n2H|SV#Og+wEZv=f2%1ELX!SX-(d3tEj$5$1}70Mp<&eI zCkfbByL7af=qQE@5vDVxx1}FSGt_a1DoE3SDI+G)mBAna)KBG4p8Epxl9QZ4BfdAN zFnF|Y(umr;gRgG6NLQ$?ZWgllEeeq~z^ZS7L?<(~O&$5|y)Al^iMKy}&W+eMm1W z7EMU)u^ke(A1#XCV>CZ71}P}0x)4wtHO8#JRG3MA-6g=`ZM!FcICCZ{IEw8Dm2&LQ z1|r)BUG^0GzI6f946RrBlfB1Vs)~8toZf~7)+G;pv&XiUO(%5bm)pl=p>nV^o*;&T z;}@oZSibzto$arQgfkp|z4Z($P>dTXE{4O=vY0!)kDO* zGF8a4wq#VaFpLfK!iELy@?-SeRrdz%F*}hjKcA*y@mj~VD3!it9lhRhX}5YOaR9$} z3mS%$2Be7{l(+MVx3 z(4?h;P!jnRmX9J9sYN#7i=iyj_5q7n#X(!cdqI2lnr8T$IfOW<_v`eB!d9xY1P=2q&WtOXY=D9QYteP)De?S4}FK6#6Ma z=E*V+#s8>L;8aVroK^6iKo=MH{4yEZ_>N-N z`(|;aOATba1^asjxlILk<4}f~`39dBFlxj>Dw(hMYKPO3EEt1@S`1lxFNM+J@uB7T zZ8WKjz7HF1-5&2=l=fqF-*@>n5J}jIxdDwpT?oKM3s8Nr`x8JnN-kCE?~aM1H!hAE z%%w(3kHfGwMnMmNj(SU(w42OrC-euI>Dsjk&jz3ts}WHqmMpzQ3vZrsXrZ|}+MHA7 z068obeXZTsO*6RS@o3x80E4ok``rV^Y3hr&C1;|ZZ0|*EKO`$lECUYG2gVFtUTw)R z4Um<0ZzlON`zTdvVdL#KFoMFQX*a5wM0Czp%wTtfK4Sjs)P**RW&?lP$(<}q%r68Z zS53Y!d@&~ne9O)A^tNrXHhXBkj~$8j%pT1%%mypa9AW5E&s9)rjF4@O3ytH{0z6riz|@< zB~UPh*wRFg2^7EbQrHf0y?E~dHlkOxof_a?M{LqQ^C!i2dawHTPYUE=X@2(3<=OOxs8qn_(y>pU>u^}3y&df{JarR0@VJn0f+U%UiF=$Wyq zQvnVHESil@d|8&R<%}uidGh7@u^(%?$#|&J$pvFC-n8&A>utA=n3#)yMkz+qnG3wd zP7xCnF|$9Dif@N~L)Vde3hW8W!UY0BgT2v(wzp;tlLmyk2%N|0jfG$%<;A&IVrOI< z!L)o>j>;dFaqA3pL}b-Je(bB@VJ4%!JeX@3x!i{yIeIso^=n?fDX`3bU=eG7sTc%g%ye8$v8P@yKE^XD=NYxTb zbf!Mk=h|otpqjFaA-vs5YOF-*GwWPc7VbaOW&stlANnCN8iftFMMrUdYNJ_Bnn5Vt zxfz@Ah|+4&P;reZxp;MmEI7C|FOv8NKUm8njF7Wb6Gi7DeODLl&G~}G4be&*Hi0Qw z5}77vL0P+7-B%UL@3n1&JPxW^d@vVwp?u#gVcJqY9#@-3X{ok#UfW3<1fb%FT`|)V~ggq z(3AUoUS-;7)^hCjdT0Kf{i}h)mBg4qhtHHBti=~h^n^OTH5U*XMgDLIR@sre`AaB$ zg)IGBET_4??m@cx&c~bA80O7B8CHR7(LX7%HThkeC*@vi{-pL%e)yXp!B2InafbDF zjPXf1mko3h59{lT6EEbxKO1Z5GF71)WwowO6kY|6tjSVSWdQ}NsK2x{>i|MKZK8%Q zfu&_0D;CO-Jg0#YmyfctyJ!mRJp)e#@O0mYdp|8x;G1%OZQ3Q847YWTyy|%^cpA;m zze0(5p{tMu^lDkpe?HynyO?a1$_LJl2L&mpeKu%8YvgRNr=%2z${%WThHG=vrWY@4 zsA`OP#O&)TetZ>s%h!=+CE15lOOls&nvC~$Qz0Ph7tHiP;O$i|eDwpT{cp>+)0-|; zY$|bB+Gbel>5aRN3>c0x)4U=|X+z+{ zn*_p*EQoquRL+=+p;=lm`d71&1NqBz&_ph)MXu(Nv6&XE7(RsS)^MGj5Q?Fwude-(sq zjJ>aOq!7!EN>@(fK7EE#;i_BGvli`5U;r!YA{JRodLBc6-`n8K+Fjgwb%sX;j=qHQ z7&Tr!)!{HXoO<2BQrV9Sw?JRaLXV8HrsNevvnf>Y-6|{T!pYLl7jp$-nEE z#X!4G4L#K0qG_4Z;Cj6=;b|Be$hi4JvMH!-voxqx^@8cXp`B??eFBz2lLD8RRaRGh zn7kUfy!YV~p(R|p7iC1Rdgt$_24i0cd-S8HpG|`@my70g^y`gu%#Tf_L21-k?sRRZHK&at(*ED0P8iw{7?R$9~OF$Ko;Iu5)ur5<->x!m93Eb zFYpIx60s=Wxxw=`$aS-O&dCO_9?b1yKiPCQmSQb>T)963`*U+Ydj5kI(B(B?HNP8r z*bfSBpSu)w(Z3j7HQoRjUG(+d=IaE~tv}y14zHHs|0UcN52fT8V_<@2ep_ee{QgZG zmgp8iv4V{k;~8@I%M3<#B;2R>Ef(Gg_cQM7%}0s*^)SK6!Ym+~P^58*wnwV1BW@eG z4sZLqsUvBbFsr#8u7S1r4teQ;t)Y@jnn_m5jS$CsW1um!p&PqAcc8!zyiXHVta9QC zY~wCwCF0U%xiQPD_INKtTb;A|Zf29(mu9NI;E zc-e>*1%(LSXB`g}kd`#}O;veb<(sk~RWL|f3ljxCnEZDdNSTDV6#Td({6l&y4IjKF z^}lIUq*ZUqgTPumD)RrCN{M^jhY>E~1pn|KOZ5((%F)G|*ZQ|r4zIbrEiV%42hJV8 z3xS)=!X1+=olbdGJ=yZil?oXLct8FM{(6ikLL3E%=q#O6(H$p~gQu6T8N!plf!96| z&Q3=`L~>U0zZh;z(pGR2^S^{#PrPxTRHD1RQOON&f)Siaf`GLj#UOk&(|@0?zm;Sx ztsGt8=29-MZs5CSf1l1jNFtNt5rFNZxJPvkNu~2}7*9468TWm>nN9TP&^!;J{-h)_ z7WsHH9|F%I`Pb!>KAS3jQWKfGivTVkMJLO-HUGM_a4UQ_%RgL6WZvrW+Z4ujZn;y@ zz9$=oO!7qVTaQAA^BhX&ZxS*|5dj803M=k&2%QrXda`-Q#IoZL6E(g+tN!6CA!CP* zCpWtCujIea)ENl0liwVfj)Nc<9mV%+e@=d`haoZ*`B7+PNjEbXBkv=B+Pi^~L#EO$D$ZqTiD8f<5$eyb54-(=3 zh)6i8i|jp(@OnRrY5B8t|LFXFQVQ895n*P16cEKTrT*~yLH6Z4e*bZ5otpRDri&+A zfNbK1D5@O=sm`fN=WzWyse!za5n%^+6dHPGX#8DyIK>?9qyX}2XvBWVqbP%%D)7$= z=#$WulZlZR<{m#gU7lwqK4WS1Ne$#_P{b17qe$~UOXCl>5b|6WVh;5vVnR<%d+Lnp z$uEmML38}U4vaW8>shm6CzB(Wei3s#NAWE3)a2)z@i{4jTn;;aQS)O@l{rUM`J@K& l00vQ5JBs~;vo!vr%%-k{2_Fq1Mn4QF81S)AQ99zk{{c4yR+0b! literal 63375 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≫L+crb^Bz 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 /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +202,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/settings.gradle.kts b/settings.gradle.kts index 9efb113..b6a91d4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,9 @@ +plugins { + id("org.zaproxy.common.settings") version "0.2.0" + + id("com.diffplug.spotless") version "6.20.0" apply false +} + include("zap-clientapi") rootProject.name = "zap-api-java" diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java index b498a73..d69cb5e 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ApiResponseList.java @@ -37,7 +37,7 @@ public ApiResponseList(Node node) throws ClientApiException { this(node.getNodeName()); Node child = node.getFirstChild(); while (child != null) { - this.addItem(ApiResponseFactory.getResponse(child)); + addItemImpl(ApiResponseFactory.getResponse(child)); child = child.getNextSibling(); } } @@ -53,7 +53,7 @@ public ApiResponseList(Node node, ApiResponseList template) throws ClientApiExce while (child != null) { Constructor cons = clazz.getConstructor(Node.class, ApiResponse.class); - this.addItem(cons.newInstance(child, template.list.get(0))); + addItemImpl(cons.newInstance(child, template.list.get(0))); child = child.getNextSibling(); } } @@ -76,7 +76,11 @@ public ApiResponseList(String name, List list) { } public void addItem(ApiResponse item) { - this.list.add(item); + addItemImpl(item); + } + + private void addItemImpl(ApiResponse item) { + list.add(item); } public List getItems() { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 9717b3a..748c0be 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -88,6 +88,7 @@ import org.zaproxy.clientapi.gen.Wappalyzer; import org.zaproxy.clientapi.gen.Websocket; +@SuppressWarnings("this-escape") public class ClientApi { private static final int DEFAULT_CONNECTION_POOLING_IN_MS = 1000; From 564d560cc7cfee19626c965078e16f384f9c1061 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 13 May 2024 10:37:02 +0100 Subject: [PATCH 121/148] Update APIs of core and release 1.14.0 Update core APIs for 2.15.0. Prepare release. Signed-off-by: thc202 --- CHANGELOG.md | 6 +- README.md | 2 +- build.gradle.kts | 2 +- .../org/zaproxy/clientapi/gen/AjaxSpider.java | 2 +- .../java/org/zaproxy/clientapi/gen/Ascan.java | 12 ++++ .../java/org/zaproxy/clientapi/gen/Core.java | 17 +++++ .../org/zaproxy/clientapi/gen/Search.java | 62 +++++++++++++++++++ .../org/zaproxy/clientapi/gen/Wappalyzer.java | 2 +- 8 files changed, 99 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02c06eb..56a7b43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.14.0] - 2024-05-13 +### Changed +- Update core APIs for 2.15. ## [1.13.0] - 2023-11-21 ### Added @@ -195,7 +197,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...HEAD +[1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 [1.11.0]: https://github.com/zaproxy/zap-api-java/compare/v1.10.0...v1.11.0 diff --git a/README.md b/README.md index 1fdd7e1..b459581 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.13.0` + * Version: `1.14.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle.kts b/build.gradle.kts index bde81fd..f90144e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ subprojects { group = "org.zaproxy" - version = "1.14.0-SNAPSHOT" + version = "1.14.0" extra["versionBC"] = "1.13.0" java { diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 5e511ba..61f4d64 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -389,7 +389,7 @@ public ApiResponse setOptionBrowserId(String string) throws ClientApiException { } /** - * Sets whether or not the the AJAX Spider will only click on the default HTML elements. + * Sets whether or not the AJAX Spider will only click on the default HTML elements. * *

This component is optional and therefore the API will only work if it is installed */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index 2e2c341..2954fae 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -211,6 +211,11 @@ public ApiResponse optionAllowAttackOnStart() throws ClientApiException { return api.callApi("ascan", "view", "optionAllowAttackOnStart", null); } + /** Tells whether or not the active scanner should encode cookie values. */ + public ApiResponse optionEncodeCookieValues() throws ClientApiException { + return api.callApi("ascan", "view", "optionEncodeCookieValues", null); + } + /** * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, * with the ID of the scan rule that's sending the requests. @@ -631,6 +636,13 @@ public ApiResponse setOptionDelayInMs(int i) throws ClientApiException { return api.callApi("ascan", "action", "setOptionDelayInMs", map); } + /** Sets whether or not the active scanner should encode cookie values. */ + public ApiResponse setOptionEncodeCookieValues(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionEncodeCookieValues", map); + } + public ApiResponse setOptionHandleAntiCSRFTokens(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java index 194a8f8..179958a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Core.java @@ -267,6 +267,15 @@ public ApiResponse numberOfAlerts(String baseurl, String riskid) throws ClientAp return api.callApi("core", "view", "numberOfAlerts", map); } + /** The detailed logging config, optionally filtered based on a name (ex: starts with). */ + public ApiResponse getLogLevel(String name) throws ClientApiException { + Map map = new HashMap<>(); + if (name != null) { + map.put("name", name); + } + return api.callApi("core", "view", "getLogLevel", map); + } + /** * Gets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). @@ -701,6 +710,14 @@ public ApiResponse deleteAlert(String id) throws ClientApiException { return api.callApi("core", "action", "deleteAlert", map); } + /** Sets the logging level for a given logger name. */ + public ApiResponse setLogLevel(String name, String loglevel) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + map.put("logLevel", loglevel); + return api.callApi("core", "action", "setLogLevel", map); + } + /** * Sets the user agent that ZAP should use when creating HTTP messages (for example, spider * messages or CONNECT requests to outgoing proxy). diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index b4a4b97..d7c0caa 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -56,6 +56,27 @@ public ApiResponse urlsByUrlRegex(String regex, String baseurl, String start, St return api.callApi("search", "view", "urlsByUrlRegex", map); } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in their + * history Tags optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ + public ApiResponse urlsByTagRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByTagRegex", map); + } + /** * Returns the URLs of the HTTP messages that match the given regular expression in the request * optionally filtered by URL and paginated with 'start' position and 'count' of messages. @@ -137,6 +158,26 @@ public ApiResponse messagesByUrlRegex(String regex, String baseurl, String start return api.callApi("search", "view", "messagesByUrlRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in their history Tags + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ + public ApiResponse messagesByTagRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByTagRegex", map); + } + /** * Returns the HTTP messages that match the given regular expression in the request optionally * filtered by URL and paginated with 'start' position and 'count' of messages. @@ -217,6 +258,27 @@ public byte[] harByUrlRegex(String regex, String baseurl, String start, String c return api.callApiOther("search", "other", "harByUrlRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in their + * history Tags optionally filtered by URL and paginated with 'start' position and 'count' of + * messages. + */ + public byte[] harByTagRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByTagRegex", map); + } + /** * Returns the HTTP messages, in HAR format, that match the given regular expression in the * request optionally filtered by URL and paginated with 'start' position and 'count' of diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java index 1a655fe..465de02 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Wappalyzer.java @@ -36,7 +36,7 @@ public Wappalyzer(ClientApi api) { } /** - * Lists all the sites recognized by the wappalyzer addon. + * Lists all the sites recognized by the Technology Detection add-on. * *

This component is optional and therefore the API will only work if it is installed */ From 0f2949a5b38865c6a4cb40f095840b6bc9667919 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 13 May 2024 11:33:51 +0100 Subject: [PATCH 122/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle.kts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56a7b43..ba961d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.14.0] - 2024-05-13 ### Changed - Update core APIs for 2.15. @@ -197,6 +199,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...HEAD [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 diff --git a/build.gradle.kts b/build.gradle.kts index f90144e..27b3edf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,8 +14,8 @@ subprojects { group = "org.zaproxy" - version = "1.14.0" - extra["versionBC"] = "1.13.0" + version = "1.15.0-SNAPSHOT" + extra["versionBC"] = "1.14.0" java { val javaVersion = JavaVersion.VERSION_11 From 2586b63847c56c2e03ac454da615b2e4420109a0 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 17 Jun 2024 16:23:30 +0100 Subject: [PATCH 123/148] Update Gradle, add Java 22 to CI Update Gradle Wrapper to 8.8 and plugins. Add Java 22 to CI to ensure it can be built with newer version. Update actions in CI workflow. Signed-off-by: thc202 --- .github/workflows/ci.yml | 6 +++--- build.gradle.kts | 4 ++-- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 2 +- gradlew.bat | 20 +++++++++--------- settings.gradle.kts | 4 ++-- .../zap-clientapi/zap-clientapi.gradle | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dafcd0d..5261387 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [11, 21] + java: [11, 21, 22] steps: - uses: actions/checkout@v4 @@ -19,7 +19,7 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/wrapper-validation-action@v1 - - uses: gradle/gradle-build-action@v2 + - uses: gradle/actions/wrapper-validation@v3 + - uses: gradle/actions/setup-gradle@v3 - run: ./gradlew assemble - run: ./gradlew check diff --git a/build.gradle.kts b/build.gradle.kts index 27b3edf..55a23a0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import net.ltgt.gradle.errorprone.errorprone plugins { id("com.diffplug.spotless") - id("net.ltgt.errorprone") version "3.1.0" + id("net.ltgt.errorprone") version "4.0.0" id("org.zaproxy.common") } @@ -34,7 +34,7 @@ subprojects { } dependencies { - "errorprone"("com.google.errorprone:error_prone_core:2.20.0") + "errorprone"("com.google.errorprone:error_prone_core:2.28.0") } tasks.withType { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 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 delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a7a990a..515ab9d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=c16d517b50dd28b3f5838f0e844b7520b8f1eb610f2f29de7e4e04a1b7c9c79b -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-all.zip +distributionSha256Sum=f8b4f4772d302c8ff580bc40d0f56e715de69b163546944f787c87abf209c961 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4..b740cf1 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..25da30d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/settings.gradle.kts b/settings.gradle.kts index b6a91d4..04a67ad 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ plugins { - id("org.zaproxy.common.settings") version "0.2.0" + id("org.zaproxy.common.settings") version "0.3.0" - id("com.diffplug.spotless") version "6.20.0" apply false + id("com.diffplug.spotless") version "6.25.0" apply false } include("zap-clientapi") diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index fb9845c..9d53915 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -1,7 +1,7 @@ plugins { id "maven-publish" id "signing" - id "me.champeau.gradle.japicmp" version "0.4.1" + id "me.champeau.gradle.japicmp" version "0.4.3" } sourceSets { examples } From 3ee983a356cb7d9608f84b3641a74caf875196a2 Mon Sep 17 00:00:00 2001 From: Rick M Date: Fri, 8 Nov 2024 05:57:22 -0500 Subject: [PATCH 124/148] Allow dependabot to update GitHub actions (#121) Signed-off-by: Rick M --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..1b52049 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + groups: + gha: + applies-to: version-updates + patterns: + - "*" From f1c326ab336ac548498a574c6b59b2365b392dba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:16:49 +0000 Subject: [PATCH 125/148] Bump gradle/actions from 3 to 4 in the gha group (#122) Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Remove now redundant action, the wrapper validation is now done by default by setup-gradle. Updates `gradle/actions` from 3 to 4 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/v3...v4) --- updated-dependencies: - dependency-name: gradle/actions dependency-type: direct:production update-type: version-update:semver-major dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5261387..e62ea90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/wrapper-validation@v3 - - uses: gradle/actions/setup-gradle@v3 + - uses: gradle/actions/setup-gradle@v4 - run: ./gradlew assemble - run: ./gradlew check From 0691e92acb3ead535f1a8d23f6e329c75fde9b57 Mon Sep 17 00:00:00 2001 From: Rick M Date: Fri, 6 Dec 2024 05:58:38 -0500 Subject: [PATCH 126/148] Pin non-GitHub actions with full sha in workflows Signed-off-by: kingthorin --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e62ea90..2c6565d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@v4 + - uses: gradle/actions/setup-gradle@cc4fc85e6b35bafd578d5ffbc76a5518407e1af0 # v4.2.1 - run: ./gradlew assemble - run: ./gradlew check From affc7555bb90d04589fb9a3585db9ca95bde6c61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jan 2025 08:55:57 +0000 Subject: [PATCH 127/148] Bump gradle/actions from 4.2.1 to 4.2.2 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.2.1 to 4.2.2 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/cc4fc85e6b35bafd578d5ffbc76a5518407e1af0...0bdd871935719febd78681f197cd39af5b6e16a6) --- updated-dependencies: - dependency-name: gradle/actions dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c6565d..f561fa1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@cc4fc85e6b35bafd578d5ffbc76a5518407e1af0 # v4.2.1 + - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2 - run: ./gradlew assemble - run: ./gradlew check From 5bf7b7140557c8728847edf455a5db8918f86805 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Jan 2025 09:41:16 +0000 Subject: [PATCH 128/148] Update APIs and release 1.15.0 Update core APIs for 2.16.0. Add/update the APIs of the add-ons. Signed-off-by: thc202 --- CHANGELOG.md | 19 ++- .../org/zaproxy/clientapi/core/ClientApi.java | 2 + .../org/zaproxy/clientapi/gen/AjaxSpider.java | 12 ++ .../java/org/zaproxy/clientapi/gen/Exim.java | 22 +++ .../java/org/zaproxy/clientapi/gen/Oast.java | 153 ++++++++++++++++++ .../org/zaproxy/clientapi/gen/Openapi.java | 10 +- .../java/org/zaproxy/clientapi/gen/Pscan.java | 89 ++++++++-- .../org/zaproxy/clientapi/gen/Replacer.java | 2 +- .../org/zaproxy/clientapi/gen/Script.java | 100 ++++++++++-- .../org/zaproxy/clientapi/gen/Search.java | 60 +++++++ .../org/zaproxy/clientapi/gen/Selenium.java | 11 ++ .../org/zaproxy/clientapi/gen/Spider.java | 14 +- .../gen/deprecated/OpenapiDeprecated.java | 36 +++++ 13 files changed, 494 insertions(+), 36 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Oast.java diff --git a/CHANGELOG.md b/CHANGELOG.md index ba961d7..ccf42ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.15.0] - 2025-01-20 +### Added +- Add the API of the following add-on: + - OAST Support + +### Changed +- Update core APIs for 2.16. +- Update the APIs of the following add-ons: + - AJAX Spider + - Import/Export + - OpenAPI Support + - Passive Scanner + - Replacer + - Script Console + - Selenium + - Spider ## [1.14.0] - 2024-05-13 ### Changed @@ -199,7 +214,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...HEAD +[1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 [1.12.0]: https://github.com/zaproxy/zap-api-java/compare/v1.11.0...v1.12.0 diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 748c0be..191f1a1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -67,6 +67,7 @@ import org.zaproxy.clientapi.gen.Graphql; import org.zaproxy.clientapi.gen.HttpSessions; import org.zaproxy.clientapi.gen.Network; +import org.zaproxy.clientapi.gen.Oast; import org.zaproxy.clientapi.gen.Openapi; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; @@ -143,6 +144,7 @@ public class ClientApi { new org.zaproxy.clientapi.gen.LocalProxies(this); public Network network = new Network(this); + public Oast oast = new Oast(this); public Openapi openapi = new Openapi(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java index 61f4d64..3b09886 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/AjaxSpider.java @@ -187,6 +187,11 @@ public ApiResponse optionClickElemsOnce() throws ClientApiException { return api.callApi("ajaxSpider", "view", "optionClickElemsOnce", null); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse optionEnableExtensions() throws ClientApiException { + return api.callApi("ajaxSpider", "view", "optionEnableExtensions", null); + } + /** * Gets if the AJAX Spider will use random values in form fields when crawling, if set to true. * @@ -411,6 +416,13 @@ public ApiResponse setOptionClickElemsOnce(boolean bool) throws ClientApiExcepti return api.callApi("ajaxSpider", "action", "setOptionClickElemsOnce", map); } + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse setOptionEnableExtensions(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ajaxSpider", "action", "setOptionEnableExtensions", map); + } + /** * Sets the time to wait after an event (in milliseconds). For example: the wait delay after the * cursor hovers over an element, in order for a menu to display, etc. diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java index 1567ca1..0e7e965 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Exim.java @@ -79,6 +79,28 @@ public ApiResponse importModsec2Logs(String filepath) throws ClientApiException return api.callApi("exim", "action", "importModsec2Logs", map); } + /** + * Exports the Sites Tree in the Sites Tree YAML format. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse exportSitesTree(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "exportSitesTree", map); + } + + /** + * Prunes the Sites Tree based on a file in the Sites Tree YAML format. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse pruneSitesTree(String filepath) throws ClientApiException { + Map map = new HashMap<>(); + map.put("filePath", filepath); + return api.callApi("exim", "action", "pruneSitesTree", map); + } + /** * Gets the HTTP messages sent through/by ZAP, in HAR format, optionally filtered by URL and * paginated with 'start' position and 'count' of messages diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Oast.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Oast.java new file mode 100644 index 0000000..70d5ead --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Oast.java @@ -0,0 +1,153 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2025 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Oast { + + private final ClientApi api; + + public Oast(ClientApi api) { + this.api = api; + } + + /** + * Gets the service used with the active scanner, if any. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getActiveScanService() throws ClientApiException { + return api.callApi("oast", "view", "getActiveScanService", null); + } + + /** + * Gets all of the services. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getServices() throws ClientApiException { + return api.callApi("oast", "view", "getServices", null); + } + + /** + * Gets the BOAST options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getBoastOptions() throws ClientApiException { + return api.callApi("oast", "view", "getBoastOptions", null); + } + + /** + * Gets the Callback options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getCallbackOptions() throws ClientApiException { + return api.callApi("oast", "view", "getCallbackOptions", null); + } + + /** + * Gets the Interactsh options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getInteractshOptions() throws ClientApiException { + return api.callApi("oast", "view", "getInteractshOptions", null); + } + + /** + * Gets the number of days the OAST records will be kept for. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse getDaysToKeepRecords() throws ClientApiException { + return api.callApi("oast", "view", "getDaysToKeepRecords", null); + } + + /** + * Sets the service used with the active scanner. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setActiveScanService(String name) throws ClientApiException { + Map map = new HashMap<>(); + map.put("name", name); + return api.callApi("oast", "action", "setActiveScanService", map); + } + + /** + * Sets the BOAST options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setBoastOptions(String server, String pollinsecs) throws ClientApiException { + Map map = new HashMap<>(); + map.put("server", server); + map.put("pollInSecs", pollinsecs); + return api.callApi("oast", "action", "setBoastOptions", map); + } + + /** + * Sets the Callback options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setCallbackOptions(String localaddress, String remoteaddress, String port) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("localAddress", localaddress); + map.put("remoteAddress", remoteaddress); + map.put("port", port); + return api.callApi("oast", "action", "setCallbackOptions", map); + } + + /** + * Sets the Interactsh options. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setInteractshOptions(String server, String pollinsecs, String authtoken) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("server", server); + map.put("pollInSecs", pollinsecs); + map.put("authToken", authtoken); + return api.callApi("oast", "action", "setInteractshOptions", map); + } + + /** + * Sets the number of days the OAST records will be kept for. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setDaysToKeepRecords(String days) throws ClientApiException { + Map map = new HashMap<>(); + map.put("days", days); + return api.callApi("oast", "action", "setDaysToKeepRecords", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java index 284a143..e792ca8 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Openapi.java @@ -41,7 +41,7 @@ public Openapi(ClientApi api) { * *

    This component is optional and therefore the API will only work if it is installed */ - public ApiResponse importFile(String file, String target, String contextid) + public ApiResponse importFile(String file, String target, String contextid, String userid) throws ClientApiException { Map map = new HashMap<>(); map.put("file", file); @@ -51,6 +51,9 @@ public ApiResponse importFile(String file, String target, String contextid) if (contextid != null) { map.put("contextId", contextid); } + if (userid != null) { + map.put("userId", userid); + } return api.callApi("openapi", "action", "importFile", map); } @@ -59,7 +62,7 @@ public ApiResponse importFile(String file, String target, String contextid) * *

    This component is optional and therefore the API will only work if it is installed */ - public ApiResponse importUrl(String url, String hostoverride, String contextid) + public ApiResponse importUrl(String url, String hostoverride, String contextid, String userid) throws ClientApiException { Map map = new HashMap<>(); map.put("url", url); @@ -69,6 +72,9 @@ public ApiResponse importUrl(String url, String hostoverride, String contextid) if (contextid != null) { map.put("contextId", contextid); } + if (userid != null) { + map.put("userId", userid); + } return api.callApi("openapi", "action", "importUrl", map); } } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index ac85056..6a4b2d1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -38,37 +38,57 @@ public Pscan(ClientApi api) { /** * Tells whether or not the passive scan should be performed only on messages that are in scope. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse scanOnlyInScope() throws ClientApiException { return api.callApi("pscan", "view", "scanOnlyInScope", null); } - /** The number of records the passive scanner still has to scan */ + /** + * The number of records the passive scanner still has to scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse recordsToScan() throws ClientApiException { return api.callApi("pscan", "view", "recordsToScan", null); } - /** Lists all passive scan rules with their ID, name, enabled state, and alert threshold. */ + /** + * Lists all passive scan rules with their ID, name, enabled state, and alert threshold. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse scanners() throws ClientApiException { return api.callApi("pscan", "view", "scanners", null); } /** - * Show information about the passive scan rule currently being run (if any). + * Shows information about the passive scan rule currently being run (if any). + * + *

    This component is optional and therefore the API will only work if it is installed * - * @deprecated Use the currentTasks view instead. + * @deprecated */ @Deprecated public ApiResponse currentRule() throws ClientApiException { return api.callApi("pscan", "view", "currentRule", null); } - /** Show information about the passive scan tasks currently being run (if any). */ + /** + * Shows information about the passive scan tasks currently being run (if any). + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse currentTasks() throws ClientApiException { return api.callApi("pscan", "view", "currentTasks", null); } - /** Gets the maximum number of alerts a passive scan rule should raise. */ + /** + * Gets the maximum number of alerts a passive scan rule should raise. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse maxAlertsPerRule() throws ClientApiException { return api.callApi("pscan", "view", "maxAlertsPerRule", null); } @@ -76,6 +96,8 @@ public ApiResponse maxAlertsPerRule() throws ClientApiException { /** * Sets whether or not the passive scanning is enabled (Note: the enabled state is not * persisted). + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse setEnabled(String enabled) throws ClientApiException { Map map = new HashMap<>(); @@ -85,6 +107,8 @@ public ApiResponse setEnabled(String enabled) throws ClientApiException { /** * Sets whether or not the passive scan should be performed only on messages that are in scope. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiException { Map map = new HashMap<>(); @@ -92,24 +116,40 @@ public ApiResponse setScanOnlyInScope(String onlyinscope) throws ClientApiExcept return api.callApi("pscan", "action", "setScanOnlyInScope", map); } - /** Enables all passive scan rules */ + /** + * Enables all passive scan rules. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse enableAllScanners() throws ClientApiException { return api.callApi("pscan", "action", "enableAllScanners", null); } - /** Disables all passive scan rules */ + /** + * Disables all passive scan rules. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse disableAllScanners() throws ClientApiException { return api.callApi("pscan", "action", "disableAllScanners", null); } - /** Enables all passive scan rules with the given IDs (comma separated list of IDs) */ + /** + * Enables passive scan rules. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse enableScanners(String ids) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); return api.callApi("pscan", "action", "enableScanners", map); } - /** Disables all passive scan rules with the given IDs (comma separated list of IDs) */ + /** + * Disables passive scan rules. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse disableScanners(String ids) throws ClientApiException { Map map = new HashMap<>(); map.put("ids", ids); @@ -117,8 +157,9 @@ public ApiResponse disableScanners(String ids) throws ClientApiException { } /** - * Sets the alert threshold of the passive scan rule with the given ID, accepted values for - * alert threshold: OFF, DEFAULT, LOW, MEDIUM and HIGH + * Sets the alert threshold of a passive scan rule. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) throws ClientApiException { @@ -128,24 +169,40 @@ public ApiResponse setScannerAlertThreshold(String id, String alertthreshold) return api.callApi("pscan", "action", "setScannerAlertThreshold", map); } - /** Sets the maximum number of alerts a passive scan rule should raise. */ + /** + * Sets the maximum number of alerts a passive scan rule can raise. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setMaxAlertsPerRule(String maxalerts) throws ClientApiException { Map map = new HashMap<>(); map.put("maxAlerts", maxalerts); return api.callApi("pscan", "action", "setMaxAlertsPerRule", map); } - /** Disables all passive scan tags. */ + /** + * Disables all passive scan tags. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse disableAllTags() throws ClientApiException { return api.callApi("pscan", "action", "disableAllTags", null); } - /** Enables all passive scan tags. */ + /** + * Enables all passive scan tags. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse enableAllTags() throws ClientApiException { return api.callApi("pscan", "action", "enableAllTags", null); } - /** Clears the passive scan queue. */ + /** + * Clears the passive scan queue. + * + *

    This component is optional and therefore the API will only work if it is installed */ diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java index 352cb76..c9d255d 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Script.java @@ -37,17 +37,29 @@ public Script(ClientApi api) { this.api = api; } - /** Lists the script engines available */ + /** + * Lists the script engines available + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse listEngines() throws ClientApiException { return api.callApi("script", "view", "listEngines", null); } - /** Lists the script types available. */ + /** + * Lists the script types available. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse listTypes() throws ClientApiException { return api.callApi("script", "view", "listTypes", null); } - /** Lists the scripts available, with its engine, name, description, type and error state. */ + /** + * Lists the scripts available, with its engine, name, description, type and error state. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse listScripts() throws ClientApiException { return api.callApi("script", "view", "listScripts", null); } @@ -55,6 +67,8 @@ public ApiResponse listScripts() throws ClientApiException { /** * Gets the value of the global variable with the given key. Returns an API error * (DOES_NOT_EXIST) if no value was previously set. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse globalVar(String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -65,6 +79,8 @@ public ApiResponse globalVar(String varkey) throws ClientApiException { /** * Gets the value (string representation) of a global custom variable. Returns an API error * (DOES_NOT_EXIST) if no value was previously set. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse globalCustomVar(String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -72,7 +88,11 @@ public ApiResponse globalCustomVar(String varkey) throws ClientApiException { return api.callApi("script", "view", "globalCustomVar", map); } - /** Gets all the global variables (key/value pairs). */ + /** + * Gets all the global variables (key/value pairs). + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse globalVars() throws ClientApiException { return api.callApi("script", "view", "globalVars", null); } @@ -80,6 +100,8 @@ public ApiResponse globalVars() throws ClientApiException { /** * Gets all the global custom variables (key/value pairs, the value is the string * representation). + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse globalCustomVars() throws ClientApiException { return api.callApi("script", "view", "globalCustomVars", null); @@ -88,6 +110,8 @@ public ApiResponse globalCustomVars() throws ClientApiException { /** * Gets the value of the variable with the given key for the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists or if no value was previously set. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse scriptVar(String scriptname, String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -99,6 +123,8 @@ public ApiResponse scriptVar(String scriptname, String varkey) throws ClientApiE /** * Gets the value (string representation) of a custom variable. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists or if no value was previously set. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse scriptCustomVar(String scriptname, String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -110,6 +136,8 @@ public ApiResponse scriptCustomVar(String scriptname, String varkey) throws Clie /** * Gets all the variables (key/value pairs) of the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse scriptVars(String scriptname) throws ClientApiException { Map map = new HashMap<>(); @@ -120,6 +148,8 @@ public ApiResponse scriptVars(String scriptname) throws ClientApiException { /** * Gets all the custom variables (key/value pairs, the value is the string representation) of a * script. Returns an API error (DOES_NOT_EXIST) if no script with the given name exists. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse scriptCustomVars(String scriptname) throws ClientApiException { Map map = new HashMap<>(); @@ -127,14 +157,22 @@ public ApiResponse scriptCustomVars(String scriptname) throws ClientApiException return api.callApi("script", "view", "scriptCustomVars", map); } - /** Enables the script with the given name */ + /** + * Enables the script with the given name + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse enable(String scriptname) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "enable", map); } - /** Disables the script with the given name */ + /** + * Disables the script with the given name + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse disable(String scriptname) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); @@ -145,6 +183,8 @@ public ApiResponse disable(String scriptname) throws ClientApiException { * Loads a script into ZAP from the given local file, with the given name, type and engine, * optionally with a description, and a charset name to read the script (the charset name is * required if the script is not in UTF-8, for example, in ISO-8859-1). + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse load( String scriptname, @@ -168,35 +208,55 @@ public ApiResponse load( return api.callApi("script", "action", "load", map); } - /** Removes the script with the given name */ + /** + * Removes the script with the given name + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse remove(String scriptname) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "remove", map); } - /** Runs the stand alone script with the given name */ + /** + * Runs the stand alone script with the given name + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse runStandAloneScript(String scriptname) throws ClientApiException { Map map = new HashMap<>(); map.put("scriptName", scriptname); return api.callApi("script", "action", "runStandAloneScript", map); } - /** Clears the global variable with the given key. */ + /** + * Clears the global variable with the given key. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearGlobalVar(String varkey) throws ClientApiException { Map map = new HashMap<>(); map.put("varKey", varkey); return api.callApi("script", "action", "clearGlobalVar", map); } - /** Clears a global custom variable. */ + /** + * Clears a global custom variable. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearGlobalCustomVar(String varkey) throws ClientApiException { Map map = new HashMap<>(); map.put("varKey", varkey); return api.callApi("script", "action", "clearGlobalCustomVar", map); } - /** Clears the global variables. */ + /** + * Clears the global variables. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearGlobalVars() throws ClientApiException { return api.callApi("script", "action", "clearGlobalVars", null); } @@ -204,6 +264,8 @@ public ApiResponse clearGlobalVars() throws ClientApiException { /** * Clears the variable with the given key of the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse clearScriptVar(String scriptname, String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -212,7 +274,11 @@ public ApiResponse clearScriptVar(String scriptname, String varkey) throws Clien return api.callApi("script", "action", "clearScriptVar", map); } - /** Clears a script custom variable. */ + /** + * Clears a script custom variable. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearScriptCustomVar(String scriptname, String varkey) throws ClientApiException { Map map = new HashMap<>(); @@ -224,6 +290,8 @@ public ApiResponse clearScriptCustomVar(String scriptname, String varkey) /** * Clears the variables of the given script. Returns an API error (DOES_NOT_EXIST) if no script * with the given name exists. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse clearScriptVars(String scriptname) throws ClientApiException { Map map = new HashMap<>(); @@ -234,6 +302,8 @@ public ApiResponse clearScriptVars(String scriptname) throws ClientApiException /** * Sets the value of the variable with the given key of the given script. Returns an API error * (DOES_NOT_EXIST) if no script with the given name exists. + * + *

    This component is optional and therefore the API will only work if it is installed */ public ApiResponse setScriptVar(String scriptname, String varkey, String varvalue) throws ClientApiException { @@ -246,7 +316,11 @@ public ApiResponse setScriptVar(String scriptname, String varkey, String varvalu return api.callApi("script", "action", "setScriptVar", map); } - /** Sets the value of the global variable with the given key. */ + /** + * Sets the value of the global variable with the given key. + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse setGlobalVar(String varkey, String varvalue) throws ClientApiException { Map map = new HashMap<>(); map.put("varKey", varkey); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java index d7c0caa..37e35c0 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Search.java @@ -77,6 +77,26 @@ public ApiResponse urlsByTagRegex(String regex, String baseurl, String start, St return api.callApi("search", "view", "urlsByTagRegex", map); } + /** + * Returns the URLs of the HTTP messages that match the given regular expression in their note + * optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ + public ApiResponse urlsByNoteRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "urlsByNoteRegex", map); + } + /** * Returns the URLs of the HTTP messages that match the given regular expression in the request * optionally filtered by URL and paginated with 'start' position and 'count' of messages. @@ -178,6 +198,26 @@ public ApiResponse messagesByTagRegex(String regex, String baseurl, String start return api.callApi("search", "view", "messagesByTagRegex", map); } + /** + * Returns the HTTP messages that match the given regular expression in their note optionally + * filtered by URL and paginated with 'start' position and 'count' of messages. + */ + public ApiResponse messagesByNoteRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApi("search", "view", "messagesByNoteRegex", map); + } + /** * Returns the HTTP messages that match the given regular expression in the request optionally * filtered by URL and paginated with 'start' position and 'count' of messages. @@ -279,6 +319,26 @@ public byte[] harByTagRegex(String regex, String baseurl, String start, String c return api.callApiOther("search", "other", "harByTagRegex", map); } + /** + * Returns the HTTP messages, in HAR format, that match the given regular expression in their + * note optionally filtered by URL and paginated with 'start' position and 'count' of messages. + */ + public byte[] harByNoteRegex(String regex, String baseurl, String start, String count) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("regex", regex); + if (baseurl != null) { + map.put("baseurl", baseurl); + } + if (start != null) { + map.put("start", start); + } + if (count != null) { + map.put("count", count); + } + return api.callApiOther("search", "other", "harByNoteRegex", map); + } + /** * Returns the HTTP messages, in HAR format, that match the given regular expression in the * request optionally filtered by URL and paginated with 'start' position and 'count' of diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 9a24d59..0b9fcb3 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -200,6 +200,17 @@ public ApiResponse addBrowserArgument(String browser, String argument, String en return api.callApi("selenium", "action", "addBrowserArgument", map); } + /** + * Launches a browser proxying through ZAP, for manual usage. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse launchBrowser(String browser) throws ClientApiException { + Map map = new HashMap<>(); + map.put("browser", browser); + return api.callApi("selenium", "action", "launchBrowser", map); + } + /** * Removes a browser argument. * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 2138265..4240ed2 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -174,7 +174,12 @@ public ApiResponse optionMaxScansInUI() throws ClientApiException { return api.callApi("spider", "view", "optionMaxScansInUI", null); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated + */ + @Deprecated public ApiResponse optionRequestWaitTime() throws ClientApiException { return api.callApi("spider", "view", "optionRequestWaitTime", null); } @@ -612,7 +617,12 @@ public ApiResponse setOptionProcessForm(boolean bool) throws ClientApiException return api.callApi("spider", "action", "setOptionProcessForm", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * This component is optional and therefore the API will only work if it is installed + * + * @deprecated + */ + @Deprecated public ApiResponse setOptionRequestWaitTime(int i) throws ClientApiException { Map map = new HashMap<>(); map.put("Integer", Integer.toString(i)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java index 02c77b0..9d948b1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/deprecated/OpenapiDeprecated.java @@ -58,6 +58,24 @@ public ApiResponse importFile(String file, String target) throws ClientApiExcept return api.callApi("openapi", "action", "importFile", map); } + /** + * Imports an OpenAPI definition from a local file. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file, String target, String contextid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + if (target != null) { + map.put("target", target); + } + if (contextid != null) { + map.put("contextId", contextid); + } + return api.callApi("openapi", "action", "importFile", map); + } + /** * Imports an OpenAPI definition from a URL. * @@ -71,4 +89,22 @@ public ApiResponse importUrl(String url, String hostoverride) throws ClientApiEx } return api.callApi("openapi", "action", "importUrl", map); } + + /** + * Imports an OpenAPI definition from a URL. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url, String hostoverride, String contextid) + throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + if (hostoverride != null) { + map.put("hostOverride", hostoverride); + } + if (contextid != null) { + map.put("contextId", contextid); + } + return api.callApi("openapi", "action", "importUrl", map); + } } From dc8e97996501e811df502def5caacbfe4eea05f4 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Jan 2025 10:06:53 +0000 Subject: [PATCH 129/148] Update version for release Remove SNAPSHOT and update readme. Signed-off-by: thc202 --- README.md | 2 +- build.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b459581..cafd690 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.14.0` + * Version: `1.15.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle.kts b/build.gradle.kts index 55a23a0..1a53fcc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ subprojects { group = "org.zaproxy" - version = "1.15.0-SNAPSHOT" + version = "1.15.0" extra["versionBC"] = "1.14.0" java { From a1438c428e97a9e65a8708011fce3f6ddd2d3a0c Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Jan 2025 14:53:04 +0000 Subject: [PATCH 130/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle.kts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccf42ca..57e5a58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.15.0] - 2025-01-20 ### Added - Add the API of the following add-on: @@ -214,6 +216,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...HEAD [1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 diff --git a/build.gradle.kts b/build.gradle.kts index 1a53fcc..4474681 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,8 +14,8 @@ subprojects { group = "org.zaproxy" - version = "1.15.0" - extra["versionBC"] = "1.14.0" + version = "1.16.0-SNAPSHOT" + extra["versionBC"] = "1.15.0" java { val javaVersion = JavaVersion.VERSION_11 From 20343e91c411e5e0bf1c582f8e90363f07070f61 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 20 Jan 2025 16:29:04 +0000 Subject: [PATCH 131/148] Remove oudated badge in README The integration is no longer working. Signed-off-by: thc202 --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index cafd690..e72d243 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![Version](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.zaproxy/zap-clientapi/) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Known Vulnerabilities](https://snyk.io/test/github/zaproxy/zap-api-java/badge.svg)](https://snyk.io/test/github/zaproxy/zap-api-java) The Java implementation to access the [ZAP API](https://www.zaproxy.org/docs/api/). For more information about ZAP consult the (main) [ZAP project](https://github.com/zaproxy/zaproxy/). From 3ad04c01cda6419f3c388565647de362e2cd7f82 Mon Sep 17 00:00:00 2001 From: daivdwe <63723761+daivdwe@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:52:37 +0100 Subject: [PATCH 132/148] Add method to get JSON responses (#129) Add support for JSON API calls with new method callApiJSON. Backgound: The new method callApiJSON allows java client API users to request a JSON response. We now also can create/build JSON models (e.g. with/for GSON) further enhancing the APIs usability. Signed-off-by: daivdwe <63723761+daivdwe@users.noreply.github.com> --- CHANGELOG.md | 4 +++- .../org/zaproxy/clientapi/core/ClientApi.java | 20 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57e5a58..6eb002c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add support for JSON API calls with new method `callApiJson`. ## [1.15.0] - 2025-01-20 ### Added @@ -233,4 +235,4 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. [1.2.0]: https://github.com/zaproxy/zap-api-java/compare/v1.1.1...v1.2.0 [1.1.1]: https://github.com/zaproxy/zap-api-java/compare/v1.1.0...v1.1.1 [1.1.0]: https://github.com/zaproxy/zap-api-java/compare/v1.0.0...v1.1.0 -[1.0.0]: https://github.com/zaproxy/zap-api-java/compare/6c778f77a817e1ff71e9279e4759535d482e8393...v1.0.0 \ No newline at end of file +[1.0.0]: https://github.com/zaproxy/zap-api-java/compare/6c778f77a817e1ff71e9279e4759535d482e8393...v1.0.0 diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 191f1a1..7f27a9a 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -472,9 +472,27 @@ public byte[] callApiOther( String method, Map params) throws ClientApiException { + return getBytes(requestMethod, "other", component, type, method, params); + } + + public String callApiJson( + String component, String type, String method, Map params) + throws ClientApiException { + byte[] json = getBytes(HttpRequest.GET_METHOD, "JSON", component, type, method, params); + return new String(json, StandardCharsets.UTF_8); + } + + private byte[] getBytes( + String requestMethod, + String format, + String component, + String type, + String method, + Map params) + throws ClientApiException { try { HttpRequest request = - buildZapRequest(requestMethod, "other", component, type, method, params); + buildZapRequest(requestMethod, format, component, type, method, params); if (debug) { debugStream.println("Open URL: " + request.getRequestUri()); } From 4d9c77450c4bf9a822f6ee34da798c82dd17b341 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 08:40:29 +0000 Subject: [PATCH 133/148] Bump gradle/actions from 4.2.2 to 4.3.0 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.2.2 to 4.3.0 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/0bdd871935719febd78681f197cd39af5b6e16a6...94baf225fe0a508e581a564467443d0e2379123b) --- updated-dependencies: - dependency-name: gradle/actions dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f561fa1..518f386 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2 + - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - run: ./gradlew assemble - run: ./gradlew check From 17d1d5e62b556176537cd37c80f8be3d806524e8 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 3 Feb 2025 13:52:34 +0000 Subject: [PATCH 134/148] Release 1.16.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eb002c..57269c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.16.0] - 2025-02-03 ### Added - Add support for JSON API calls with new method `callApiJson`. @@ -218,7 +218,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...HEAD +[1.16.0]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...v1.16.0 [1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 [1.13.0]: https://github.com/zaproxy/zap-api-java/compare/v1.12.0...v1.13.0 diff --git a/README.md b/README.md index e72d243..9d6a99c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.15.0` + * Version: `1.16.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle.kts b/build.gradle.kts index 4474681..8cfec3d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ subprojects { group = "org.zaproxy" - version = "1.16.0-SNAPSHOT" + version = "1.16.0" extra["versionBC"] = "1.15.0" java { From 28906fab6c54886ffe977bfe30d4927c8b8a7337 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 3 Feb 2025 14:24:09 +0000 Subject: [PATCH 135/148] Prepare next dev iteration Update version and changelog. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle.kts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57269c3..4d4d8be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.16.0] - 2025-02-03 ### Added - Add support for JSON API calls with new method `callApiJson`. @@ -218,6 +220,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.16.0...HEAD [1.16.0]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...v1.16.0 [1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 diff --git a/build.gradle.kts b/build.gradle.kts index 8cfec3d..6150f8e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,8 +14,8 @@ subprojects { group = "org.zaproxy" - version = "1.16.0" - extra["versionBC"] = "1.15.0" + version = "1.17.0-SNAPSHOT" + extra["versionBC"] = "1.16.0" java { val javaVersion = JavaVersion.VERSION_11 From 8f037b4adf1616cd8e26cd82446dc8e7ca28c615 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 08:50:46 +0000 Subject: [PATCH 136/148] Bump gradle/actions from 4.3.0 to 4.3.1 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.3.0 to 4.3.1 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/94baf225fe0a508e581a564467443d0e2379123b...06832c7b30a0129d7fb559bcc6e43d26f6374244) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 4.3.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 518f386..2df70fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - run: ./gradlew assemble - run: ./gradlew check From 5c9c7aeac79a5c8406b9ad6e8cf221331d2025a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:47:35 +0000 Subject: [PATCH 137/148] Bump gradle/actions from 4.3.1 to 4.4.0 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.3.1 to 4.4.0 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/06832c7b30a0129d7fb559bcc6e43d26f6374244...8379f6a1328ee0e06e2bb424dadb7b159856a326) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 4.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2df70fb..29dcb7d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + - uses: gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 - run: ./gradlew assemble - run: ./gradlew check From 676a42c273f5f67845efcb3b97ac174d2447fb30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:15:56 +0000 Subject: [PATCH 138/148] Bump gradle/actions from 4.4.0 to 4.4.1 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.4.0 to 4.4.1 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/8379f6a1328ee0e06e2bb424dadb7b159856a326...ac638b010cf58a27ee6c972d7336334ccaf61c96) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 4.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 29dcb7d..958ff1c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@8379f6a1328ee0e06e2bb424dadb7b159856a326 # v4.4.0 + - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - run: ./gradlew assemble - run: ./gradlew check From 8468e9a58a8f922337c7b745ac65bc632288d649 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 28 Feb 2025 08:34:23 +0000 Subject: [PATCH 139/148] Update Gradle Update Gradle Wrapper to 8.13 and plugins, drop Java 11 from CI which is no longer supported by the ZAP Gradle plugins. Address deprecations. Use Java 11 for releases. Signed-off-by: thc202 --- .github/workflows/ci.yml | 2 +- build.gradle.kts | 12 +++++++++--- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 6 ++++-- gradlew.bat | 2 ++ settings.gradle.kts | 2 +- .../zap-clientapi/zap-clientapi.gradle | 10 +++++----- 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 958ff1c..17297e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [11, 21, 22] + java: [17, 21, 22] steps: - uses: actions/checkout@v4 diff --git a/build.gradle.kts b/build.gradle.kts index 6150f8e..c098cc1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,9 +18,15 @@ subprojects { extra["versionBC"] = "1.16.0" java { - val javaVersion = JavaVersion.VERSION_11 - sourceCompatibility = javaVersion - targetCompatibility = javaVersion + if (System.getenv("RELEASE") != null) { + toolchain { + languageVersion.set(JavaLanguageVersion.of(11)) + } + } else { + val javaVersion = JavaVersion.VERSION_11 + sourceCompatibility = javaVersion + targetCompatibility = javaVersion + } } spotless { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34877 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�{ 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 515ab9d..2a6e21b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=f8b4f4772d302c8ff580bc40d0f56e715de69b163546944f787c87abf209c961 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip +distributionSha256Sum=fba8464465835e74f7270bbf43d6d8a8d7709ab0a43ce1aa3323f73e9aa0c612 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf1..faf9300 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/gradlew.bat b/gradlew.bat index 25da30d..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/settings.gradle.kts b/settings.gradle.kts index 04a67ad..c99cc74 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("org.zaproxy.common.settings") version "0.3.0" + id("org.zaproxy.common.settings") version "0.5.0" id("com.diffplug.spotless") version "6.25.0" apply false } diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index 9d53915..cd11716 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -38,8 +38,8 @@ File clientapiJar(version) { } task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) { - group 'verification' - description "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." + group = 'verification' + description = "Checks artifacts' binary compatibility with latest (released) version '$versionBC'." oldClasspath.from(files(clientapiJar(versionBC))) newClasspath.from(tasks.named(JavaPlugin.JAR_TASK_NAME)) @@ -67,8 +67,8 @@ task sourcesJar(type: Jar) { } task uberJar(type: Jar) { - group 'build' - description 'Assembles a jar archive containing the main jar and its dependencies.' + group = 'build' + description = 'Assembles a jar archive containing the main jar and its dependencies.' archiveBaseName.set('zap-api') manifest.from jar.manifest from { @@ -88,7 +88,7 @@ publishing { maven { def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" - url version.endsWith("SNAPSHOT") ? snapshotsRepoUrl : releasesRepoUrl + url = version.endsWith("SNAPSHOT") ? snapshotsRepoUrl : releasesRepoUrl if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { credentials { From e8c2afe22ff94ad5ea615401538eac576aad4496 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Sep 2025 15:33:21 +0000 Subject: [PATCH 140/148] Bump the gha group with 3 updates Bumps the gha group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-java](https://github.com/actions/setup-java) and [gradle/actions](https://github.com/gradle/actions). Updates `actions/checkout` from 4 to 5 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) Updates `actions/setup-java` from 4 to 5 - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v4...v5) Updates `gradle/actions` from 4.4.1 to 4.4.2 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/ac638b010cf58a27ee6c972d7336334ccaf61c96...017a9effdb900e5b5b2fddfb590a105619dca3c3) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: gha - dependency-name: actions/setup-java dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major dependency-group: gha - dependency-name: gradle/actions dependency-version: 4.4.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 17297e4..dfff48d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,11 +14,11 @@ jobs: java: [17, 21, 22] steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@v5 + - uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + - uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2 - run: ./gradlew assemble - run: ./gradlew check From 315717b15838857d8dfcbaedd08939ba0cfd22ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 08:14:05 +0000 Subject: [PATCH 141/148] Bump gradle/actions from 4.4.2 to 4.4.4 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.4.2 to 4.4.4 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/017a9effdb900e5b5b2fddfb590a105619dca3c3...748248ddd2a24f49513d8f472f81c3a07d4d50e1) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 4.4.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfff48d..38faacb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@017a9effdb900e5b5b2fddfb590a105619dca3c3 # v4.4.2 + - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 - run: ./gradlew assemble - run: ./gradlew check From 37fa80307b2dbdd19ae347da068132881408a36d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 08:10:00 +0000 Subject: [PATCH 142/148] Bump gradle/actions from 4.4.4 to 5.0.0 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 4.4.4 to 5.0.0 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/748248ddd2a24f49513d8f472f81c3a07d4d50e1...4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 5.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38faacb..be7f8c1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 - run: ./gradlew assemble - run: ./gradlew check From d93cf763681e50b65e67bd0813ffd8f063d9cedd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:01:30 +0000 Subject: [PATCH 143/148] Bump actions/checkout from 5 to 6 in the gha group Bumps the gha group with 1 update: [actions/checkout](https://github.com/actions/checkout). Updates `actions/checkout` from 5 to 6 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be7f8c1..c9d5c1a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: java: [17, 21, 22] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: distribution: 'temurin' From cfb5326ac809139ef640e2beb30bbf07ccab77a9 Mon Sep 17 00:00:00 2001 From: thc202 Date: Fri, 12 Dec 2025 11:36:28 +0000 Subject: [PATCH 144/148] Update APIs of add-ons and core Update core APIs for 2.17.0. Add the API of the following add-on: - Client Side Integration version 0.20.0; - Postman Support version 0.7.0. Update the APIs of the following add-ons: - Automation Framework version 0.58.0; - Passive Scanner version 0.6.0; - Selenium version 15.43.0; - Spider version 0.18.0. Signed-off-by: thc202 --- CHANGELOG.md | 12 ++ .../org/zaproxy/clientapi/core/ClientApi.java | 6 + .../java/org/zaproxy/clientapi/gen/Alert.java | 18 +++ .../java/org/zaproxy/clientapi/gen/Ascan.java | 30 +++++ .../org/zaproxy/clientapi/gen/Automation.java | 29 ++++- .../org/zaproxy/clientapi/gen/Client.java | 76 +++++++++++++ .../zaproxy/clientapi/gen/ClientSpider.java | 106 ++++++++++++++++++ .../org/zaproxy/clientapi/gen/Postman.java | 59 ++++++++++ .../java/org/zaproxy/clientapi/gen/Pscan.java | 20 ++++ .../org/zaproxy/clientapi/gen/Selenium.java | 40 +++++++ .../org/zaproxy/clientapi/gen/Spider.java | 22 +++- 11 files changed, 414 insertions(+), 4 deletions(-) create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Client.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ClientSpider.java create mode 100644 subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Postman.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d4d8be..8043e70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Add the APIs of the following add-ons: + - Client Side Integration version 0.20.0; + - Postman Support version 0.7.0. + +### Changed +- Update core APIs for 2.17. +- Update the APIs of the following add-ons: + - Automation Framework version 0.58.0; + - Passive Scanner version 0.6.0; + - Selenium version 15.43.0; + - Spider version 0.18.0. ## [1.16.0] - 2025-02-03 ### Added diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java index 7f27a9a..e57e7a7 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/core/ClientApi.java @@ -60,6 +60,8 @@ import org.zaproxy.clientapi.gen.Automation; import org.zaproxy.clientapi.gen.Autoupdate; import org.zaproxy.clientapi.gen.Break; +import org.zaproxy.clientapi.gen.Client; +import org.zaproxy.clientapi.gen.ClientSpider; import org.zaproxy.clientapi.gen.Context; import org.zaproxy.clientapi.gen.Core; import org.zaproxy.clientapi.gen.Exim; @@ -71,6 +73,7 @@ import org.zaproxy.clientapi.gen.Openapi; import org.zaproxy.clientapi.gen.Params; import org.zaproxy.clientapi.gen.Pnh; +import org.zaproxy.clientapi.gen.Postman; import org.zaproxy.clientapi.gen.Pscan; import org.zaproxy.clientapi.gen.Replacer; import org.zaproxy.clientapi.gen.Reports; @@ -119,6 +122,8 @@ public class ClientApi { public Automation automation = new Automation(this); public Autoupdate autoupdate = new Autoupdate(this); public Break brk = new Break(this); + public Client client = new Client(this); + public ClientSpider clientSpider = new ClientSpider(this); public Context context = new Context(this); public Core core = new Core(this); public Exim exim = new Exim(this); @@ -148,6 +153,7 @@ public class ClientApi { public Openapi openapi = new Openapi(this); public Params params = new Params(this); public Pnh pnh = new Pnh(this); + public Postman postman = new Postman(this); public Pscan pscan = new Pscan(this); public Replacer replacer = new Replacer(this); public Reports reports = new Reports(this); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java index f583720..5bd6940 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Alert.java @@ -61,6 +61,21 @@ public ApiResponse alerts(String baseurl, String start, String count, String ris public ApiResponse alerts( String baseurl, String start, String count, String riskid, String contextname) throws ClientApiException { + return alerts(baseurl, start, count, riskid, null, null); + } + + /** + * Gets the alerts raised by ZAP, optionally filtering by URL or riskId, and paginating with + * 'start' position and 'count' of alerts + */ + public ApiResponse alerts( + String baseurl, + String start, + String count, + String riskid, + String contextname, + String falsepositive) + throws ClientApiException { Map map = new HashMap<>(); if (baseurl != null) { map.put("baseurl", baseurl); @@ -77,6 +92,9 @@ public ApiResponse alerts( if (contextname != null) { map.put("contextName", contextname); } + if (falsepositive != null) { + map.put("falsePositive", falsepositive); + } return api.callApi("alert", "view", "alerts", map); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java index 2954fae..ad4929b 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Ascan.java @@ -216,6 +216,11 @@ public ApiResponse optionEncodeCookieValues() throws ClientApiException { return api.callApi("ascan", "view", "optionEncodeCookieValues", null); } + /** Tells whether or not the active scanner should exclude anti-csrf tokens from the scan. */ + public ApiResponse optionExcludeAntiCsrfTokens() throws ClientApiException { + return api.callApi("ascan", "view", "optionExcludeAntiCsrfTokens", null); + } + /** * Tells whether or not the active scanner should inject the HTTP request header X-ZAP-Scan-ID, * with the ID of the scan rule that's sending the requests. @@ -224,6 +229,14 @@ public ApiResponse optionInjectPluginIdInHeader() throws ClientApiException { return api.callApi("ascan", "view", "optionInjectPluginIdInHeader", null); } + /** + * Tells whether or not the temporary HTTP messages sent while active scanning should be + * persisted. + */ + public ApiResponse optionPersistTemporaryMessages() throws ClientApiException { + return api.callApi("ascan", "view", "optionPersistTemporaryMessages", null); + } + public ApiResponse optionPromptInAttackMode() throws ClientApiException { return api.callApi("ascan", "view", "optionPromptInAttackMode", null); } @@ -643,6 +656,13 @@ public ApiResponse setOptionEncodeCookieValues(boolean bool) throws ClientApiExc return api.callApi("ascan", "action", "setOptionEncodeCookieValues", map); } + /** Sets whether or not the active scanner should exclude anti-csrf tokens from the scan. */ + public ApiResponse setOptionExcludeAntiCsrfTokens(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionExcludeAntiCsrfTokens", map); + } + public ApiResponse setOptionHandleAntiCSRFTokens(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); @@ -702,6 +722,16 @@ public ApiResponse setOptionMaxScansInUI(int i) throws ClientApiException { return api.callApi("ascan", "action", "setOptionMaxScansInUI", map); } + /** + * Sets whether or not the temporary HTTP messages sent while active scanning should be + * persisted. + */ + public ApiResponse setOptionPersistTemporaryMessages(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("ascan", "action", "setOptionPersistTemporaryMessages", map); + } + public ApiResponse setOptionPromptInAttackMode(boolean bool) throws ClientApiException { Map map = new HashMap<>(); map.put("Boolean", Boolean.toString(bool)); diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java index 36efd80..8b3f141 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Automation.java @@ -35,21 +35,44 @@ public Automation(ClientApi api) { this.api = api; } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Returns the progress details for the specified planId + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse planProgress(String planid) throws ClientApiException { Map map = new HashMap<>(); map.put("planId", planid); return api.callApi("automation", "view", "planProgress", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Loads and asynchronously runs the plan in the specified file, returning a planId + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse runPlan(String filepath) throws ClientApiException { Map map = new HashMap<>(); map.put("filePath", filepath); return api.callApi("automation", "action", "runPlan", map); } - /** This component is optional and therefore the API will only work if it is installed */ + /** + * Stops the running plan identified by the planId + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse stopPlan(String planid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("planId", planid); + return api.callApi("automation", "action", "stopPlan", map); + } + + /** + * Ends the currently running delay job, if any + * + *

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse endDelayJob() throws ClientApiException { return api.callApi("automation", "action", "endDelayJob", null); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Client.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Client.java new file mode 100644 index 0000000..1d843de --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Client.java @@ -0,0 +1,76 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2025 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Client { + + private final ClientApi api; + + public Client(ClientApi api) { + this.api = api; + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse reportObject(String objectjson) throws ClientApiException { + Map map = new HashMap<>(); + map.put("objectJson", objectjson); + return api.callApi("client", "action", "reportObject", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse reportEvent(String eventjson) throws ClientApiException { + Map map = new HashMap<>(); + map.put("eventJson", eventjson); + return api.callApi("client", "action", "reportEvent", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse reportZestStatement(String statementjson) throws ClientApiException { + Map map = new HashMap<>(); + map.put("statementJson", statementjson); + return api.callApi("client", "action", "reportZestStatement", map); + } + + /** This component is optional and therefore the API will only work if it is installed */ + public ApiResponse reportZestScript(String scriptjson) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scriptJson", scriptjson); + return api.callApi("client", "action", "reportZestScript", map); + } + + /** + * Exports the Client Map to a file. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse exportClientMap(String pathyaml) throws ClientApiException { + Map map = new HashMap<>(); + map.put("pathYaml", pathyaml); + return api.callApi("client", "action", "exportClientMap", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ClientSpider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ClientSpider.java new file mode 100644 index 0000000..a1176fe --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/ClientSpider.java @@ -0,0 +1,106 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2025 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class ClientSpider { + + private final ClientApi api; + + public ClientSpider(ClientApi api) { + this.api = api; + } + + /** + * Gets the status of a client spider scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse status(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("clientSpider", "view", "status", map); + } + + /** + * Starts a client spider scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse scan( + String browser, + String url, + String contextname, + String username, + String subtreeonly, + String maxcrawldepth, + String pageloadtime, + String numberofbrowsers, + String scopecheck) + throws ClientApiException { + Map map = new HashMap<>(); + if (browser != null) { + map.put("browser", browser); + } + if (url != null) { + map.put("url", url); + } + if (contextname != null) { + map.put("contextName", contextname); + } + if (username != null) { + map.put("userName", username); + } + if (subtreeonly != null) { + map.put("subtreeOnly", subtreeonly); + } + if (maxcrawldepth != null) { + map.put("maxCrawlDepth", maxcrawldepth); + } + if (pageloadtime != null) { + map.put("pageLoadTime", pageloadtime); + } + if (numberofbrowsers != null) { + map.put("numberOfBrowsers", numberofbrowsers); + } + if (scopecheck != null) { + map.put("scopeCheck", scopecheck); + } + return api.callApi("clientSpider", "action", "scan", map); + } + + /** + * Stops a client spider scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse stop(String scanid) throws ClientApiException { + Map map = new HashMap<>(); + map.put("scanId", scanid); + return api.callApi("clientSpider", "action", "stop", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Postman.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Postman.java new file mode 100644 index 0000000..f8b46bd --- /dev/null +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Postman.java @@ -0,0 +1,59 @@ +/* + * Zed Attack Proxy (ZAP) and its related class files. + * + * ZAP is an HTTP/HTTPS proxy for assessing web application security. + * + * Copyright 2025 The ZAP Development Team + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.zaproxy.clientapi.gen; + +import java.util.HashMap; +import java.util.Map; +import org.zaproxy.clientapi.core.ApiResponse; +import org.zaproxy.clientapi.core.ClientApi; +import org.zaproxy.clientapi.core.ClientApiException; + +/** This file was automatically generated. */ +@SuppressWarnings("javadoc") +public class Postman { + + private final ClientApi api; + + public Postman(ClientApi api) { + this.api = api; + } + + /** + * Imports a Postman collection from a file. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importFile(String file) throws ClientApiException { + Map map = new HashMap<>(); + map.put("file", file); + return api.callApi("postman", "action", "importFile", map); + } + + /** + * Imports a Postman collection from a URL. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse importUrl(String url) throws ClientApiException { + Map map = new HashMap<>(); + map.put("url", url); + return api.callApi("postman", "action", "importUrl", map); + } +} diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java index 6a4b2d1..e97caa1 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Pscan.java @@ -93,6 +93,15 @@ public ApiResponse maxAlertsPerRule() throws ClientApiException { return api.callApi("pscan", "view", "maxAlertsPerRule", null); } + /** + * Gets the maximum body size in bytes that the passive scanner will scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse maxBodySizeInBytes() throws ClientApiException { + return api.callApi("pscan", "view", "maxBodySizeInBytes", null); + } + /** * Sets whether or not the passive scanning is enabled (Note: the enabled state is not * persisted). @@ -180,6 +189,17 @@ public ApiResponse setMaxAlertsPerRule(String maxalerts) throws ClientApiExcepti return api.callApi("pscan", "action", "setMaxAlertsPerRule", map); } + /** + * Sets the maximum body size in bytes that the passive scanner will scan. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setMaxBodySizeInBytes(String maxsize) throws ClientApiException { + Map map = new HashMap<>(); + map.put("maxSize", maxsize); + return api.callApi("pscan", "action", "setMaxBodySizeInBytes", map); + } + /** * Disables all passive scan tags. * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java index 0b9fcb3..63e8f54 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Selenium.java @@ -59,6 +59,24 @@ public ApiResponse optionChromeDriverPath() throws ClientApiException { return api.callApi("selenium", "view", "optionChromeDriverPath", null); } + /** + * Returns the current path to Edge binary + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionEdgeBinaryPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionEdgeBinaryPath", null); + } + + /** + * Returns the current path to EdgeDriver + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionEdgeDriverPath() throws ClientApiException { + return api.callApi("selenium", "view", "optionEdgeDriverPath", null); + } + /** * Returns the current path to Firefox binary * @@ -132,6 +150,28 @@ public ApiResponse setOptionChromeDriverPath(String string) throws ClientApiExce return api.callApi("selenium", "action", "setOptionChromeDriverPath", map); } + /** + * Sets the current path to Edge binary + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionEdgeBinaryPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionEdgeBinaryPath", map); + } + + /** + * Sets the current path to EdgeDriver + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionEdgeDriverPath(String string) throws ClientApiException { + Map map = new HashMap<>(); + map.put("String", string); + return api.callApi("selenium", "action", "setOptionEdgeDriverPath", map); + } + /** * Sets the current path to Firefox binary * diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java index 4240ed2..2c98443 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Spider.java @@ -161,7 +161,7 @@ public ApiResponse optionMaxDuration() throws ClientApiException { } /** - * Gets the maximum size, in bytes, that a response might have to be parsed. + * Gets the maximum size, in bytes, that a response might have to be parsed, or 0 for unlimited. * *

    This component is optional and therefore the API will only work if it is installed */ @@ -213,6 +213,15 @@ public ApiResponse optionHandleODataParametersVisited() throws ClientApiExceptio return api.callApi("spider", "view", "optionHandleODataParametersVisited", null); } + /** + * Gets whether or not the spider should attempt to avoid logout related paths/functionality. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse optionLogoutAvoidance() throws ClientApiException { + return api.callApi("spider", "view", "optionLogoutAvoidance", null); + } + /** This component is optional and therefore the API will only work if it is installed */ public ApiResponse optionParseComments() throws ClientApiException { return api.callApi("spider", "view", "optionParseComments", null); @@ -513,6 +522,17 @@ public ApiResponse setOptionHandleODataParametersVisited(boolean bool) return api.callApi("spider", "action", "setOptionHandleODataParametersVisited", map); } + /** + * Sets whether or not the Spider should attempt to avoid logout related paths/functionality. + * + *

    This component is optional and therefore the API will only work if it is installed + */ + public ApiResponse setOptionLogoutAvoidance(boolean bool) throws ClientApiException { + Map map = new HashMap<>(); + map.put("Boolean", Boolean.toString(bool)); + return api.callApi("spider", "action", "setOptionLogoutAvoidance", map); + } + /** * Sets the maximum number of child nodes (per node) that can be crawled, 0 means no limit. * From 1533f6ab78c6c4d85e58a465599e41263d761ee6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 15 Dec 2025 16:06:42 +0000 Subject: [PATCH 145/148] Release 1.17.0 Update version, readme, and changelog for new release. Signed-off-by: thc202 --- CHANGELOG.md | 4 ++-- README.md | 2 +- build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8043e70..8298207 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [1.17.0] - 2025-12-15 ### Added - Add the APIs of the following add-ons: - Client Side Integration version 0.20.0; @@ -232,7 +232,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. -[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.16.0...HEAD +[1.17.0]: https://github.com/zaproxy/zap-api-java/compare/v1.16.0...v1.17.0 [1.16.0]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...v1.16.0 [1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 [1.14.0]: https://github.com/zaproxy/zap-api-java/compare/v1.13.0...v1.14.0 diff --git a/README.md b/README.md index 9d6a99c..aaa2c7a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ can be obtained from [Maven Central](https://search.maven.org/) with following c * GroupId: `org.zaproxy` * ArtifactId: `zap-clientapi` - * Version: `1.16.0` + * Version: `1.17.0` Previous releases are also available, more details can be found in [Maven Central](https://search.maven.org/search?q=g:org.zaproxy%20AND%20a:zap-clientapi&core=gav). diff --git a/build.gradle.kts b/build.gradle.kts index c098cc1..3bf93eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ subprojects { group = "org.zaproxy" - version = "1.17.0-SNAPSHOT" + version = "1.17.0" extra["versionBC"] = "1.16.0" java { From c86e1792e5aa6ae2327789036c4ba86a911092ba Mon Sep 17 00:00:00 2001 From: thc202 Date: Mon, 15 Dec 2025 16:19:59 +0000 Subject: [PATCH 146/148] Prepare next dev iteration and update Maven URLs Update version and changelog. Update the Maven URLs to latest locations. Signed-off-by: thc202 --- CHANGELOG.md | 3 +++ build.gradle.kts | 4 ++-- subprojects/zap-clientapi/zap-clientapi.gradle | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8298207..f6bcb1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + ## [1.17.0] - 2025-12-15 ### Added - Add the APIs of the following add-ons: @@ -232,6 +234,7 @@ of the alert (zaproxy/zaproxy#1341), older methods were deprecated. - First version as "stand alone library", it was migrated from the [zaproxy repository](https://github.com/zaproxy/zaproxy) and released to Maven Central. +[Unreleased]: https://github.com/zaproxy/zap-api-java/compare/v1.17.0...HEAD [1.17.0]: https://github.com/zaproxy/zap-api-java/compare/v1.16.0...v1.17.0 [1.16.0]: https://github.com/zaproxy/zap-api-java/compare/v1.15.0...v1.16.0 [1.15.0]: https://github.com/zaproxy/zap-api-java/compare/v1.14.0...v1.15.0 diff --git a/build.gradle.kts b/build.gradle.kts index 3bf93eb..e36d43f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,8 +14,8 @@ subprojects { group = "org.zaproxy" - version = "1.17.0" - extra["versionBC"] = "1.16.0" + version = "1.18.0-SNAPSHOT" + extra["versionBC"] = "1.17.0" java { if (System.getenv("RELEASE") != null) { diff --git a/subprojects/zap-clientapi/zap-clientapi.gradle b/subprojects/zap-clientapi/zap-clientapi.gradle index cd11716..8fa565e 100644 --- a/subprojects/zap-clientapi/zap-clientapi.gradle +++ b/subprojects/zap-clientapi/zap-clientapi.gradle @@ -86,8 +86,8 @@ build.dependsOn 'uberJar' publishing { repositories { maven { - def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" + def releasesRepoUrl = "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/" + def snapshotsRepoUrl = "https://central.sonatype.com/repository/maven-snapshots/" url = version.endsWith("SNAPSHOT") ? snapshotsRepoUrl : releasesRepoUrl if (project.hasProperty('ossrhUsername') && project.hasProperty('ossrhPassword')) { From 1583ad9bcd56c68fa4640ef7f4696d5df908a78f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 08:44:11 +0000 Subject: [PATCH 147/148] Bump gradle/actions from 5.0.0 to 5.0.1 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 5.0.0 to 5.0.1 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2...f29f5a9d7b09a7c6b29859002d29d24e1674c884) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 5.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9d5c1a..bdebc3d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@4d9f0ba0025fe599b4ebab900eb7f3a1d93ef4c2 # v5.0.0 + - uses: gradle/actions/setup-gradle@f29f5a9d7b09a7c6b29859002d29d24e1674c884 # v5.0.1 - run: ./gradlew assemble - run: ./gradlew check From c0e0477651d1f9bebb205bcf5d2850dfb070e105 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 08:42:50 +0000 Subject: [PATCH 148/148] Bump gradle/actions from 5.0.1 to 5.0.2 in the gha group Bumps the gha group with 1 update: [gradle/actions](https://github.com/gradle/actions). Updates `gradle/actions` from 5.0.1 to 5.0.2 - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/f29f5a9d7b09a7c6b29859002d29d24e1674c884...0723195856401067f7a2779048b490ace7a47d7c) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: 5.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gha ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bdebc3d..8901a2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,6 @@ jobs: with: distribution: 'temurin' java-version: ${{ matrix.java }} - - uses: gradle/actions/setup-gradle@f29f5a9d7b09a7c6b29859002d29d24e1674c884 # v5.0.1 + - uses: gradle/actions/setup-gradle@0723195856401067f7a2779048b490ace7a47d7c # v5.0.2 - run: ./gradlew assemble - run: ./gradlew check

    This component is optional and therefore the API will only work if it is installed + */ public ApiResponse clearQueue() throws ClientApiException { return api.callApi("pscan", "action", "clearQueue", null); } diff --git a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java index 4ad39f6..281f092 100644 --- a/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java +++ b/subprojects/zap-clientapi/src/main/java/org/zaproxy/clientapi/gen/Replacer.java @@ -53,7 +53,7 @@ public ApiResponse rules() throws ClientApiException { * treated as a regex otherwise false, matchString is the string that will be matched against, * replacement is the replacement string, initiators may be blank (for all initiators) or a * comma separated list of integers as defined in HttpSender + * href="https://www.zaproxy.org/docs/constants/">Request Initiator Constants * *