/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright 2010 psiinon@gmail.com * * 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.zap.extension.search; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.parosproxy.paros.network.HttpMessage; import org.zaproxy.zap.extension.httppanel.HttpPanel; public class SearchResult { private ExtensionSearch.Type type; private String customSearcherName; private HttpMessage message; private String regEx; private String stringFound; private List<SearchMatch> matches = null; private SearchMatch lastMatch = null; public SearchResult(ExtensionSearch.Type type, String regEx, String stringFound, SearchMatch sm) { this(type, null, regEx, stringFound, sm); } public SearchResult(ExtensionSearch.Type type, String customSearcherName, String regEx, String stringFound, SearchMatch sm) { this.message = sm.getMessage(); this.type = type; this.customSearcherName = customSearcherName; this.regEx = regEx; this.stringFound = stringFound; matches = new ArrayList<>(1); matches.add(sm); } public SearchResult(HttpMessage message, ExtensionSearch.Type type, String regEx, String stringFound) { super(); this.message = message; this.type = type; this.regEx = regEx; this.stringFound = stringFound; } public String getRegEx() { return regEx; } public String getStringFound() { return stringFound; } public void setStringFound(String stringFound) { this.stringFound = stringFound; } public HttpMessage getMessage() { return message; } public void setMessage(HttpMessage message) { this.message = message; } public ExtensionSearch.Type getType() { return type; } public String getCustomSearcherName() { return customSearcherName; } public void setType(ExtensionSearch.Type type) { this.type = type; } public SearchMatch getFirstMatch(HttpPanel reqPanel, HttpPanel resPanel) { if (matches == null) { enumerateMatches(reqPanel, resPanel); } if (matches.size() > 0) { lastMatch = matches.get(0); return lastMatch; } return null; } public SearchMatch getLastMatch(HttpPanel reqPanel, HttpPanel resPanel) { if (matches == null) { enumerateMatches(reqPanel, resPanel); } if (matches.size() > 0) { lastMatch = matches.get(matches.size() - 1); return lastMatch; } return null; } public SearchMatch getNextMatch() { if (lastMatch != null) { int i = matches.indexOf(lastMatch); if (i >= 0 && i < matches.size()-1) { lastMatch = matches.get(i+1); return lastMatch; } } return null; } public SearchMatch getPrevMatch() { if (lastMatch != null) { int i = matches.indexOf(lastMatch); if (i >= 1) { lastMatch = matches.get(i-1); return lastMatch; } } return null; } private void enumerateMatches(HttpPanel reqPanel, HttpPanel resPanel) { matches = new ArrayList<>(); Pattern p = Pattern.compile(regEx, Pattern.MULTILINE| Pattern.CASE_INSENSITIVE); // URL if (ExtensionSearch.Type.URL.equals(type)) { // TODO: handle multiple matches in the url? reqPanel.headerSearch(p, matches); return; } // Request Header if (ExtensionSearch.Type.Header.equals(type)) { reqPanel.headerSearch(p, matches); return; } // All or Request if (ExtensionSearch.Type.All.equals(type) || ExtensionSearch.Type.Request.equals(type)) { reqPanel.headerSearch(p, matches); reqPanel.bodySearch(p, matches); } // All or response if (ExtensionSearch.Type.All.equals(type) || ExtensionSearch.Type.Response.equals(type)) { resPanel.headerSearch(p, matches); resPanel.bodySearch(p, matches); } } }