/*
* 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.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.FileConfiguration;
import org.parosproxy.paros.model.Model;
import org.zaproxy.zap.extension.httppanel.HttpPanel;
import org.zaproxy.zap.extension.httppanel.component.HttpPanelComponentInterface;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelDefaultViewSelector;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelView;
public class HttpPanelManager {
private static HttpPanelManager instance = null;
private HttpPanelManagement requestPanels;
private HttpPanelManagement responsePanels;
private HttpPanelManager() {
requestPanels = new HttpPanelManagement();
responsePanels = new HttpPanelManagement();
}
public static HttpPanelManager getInstance() {
if (instance == null) {
createInstance();
}
return instance;
}
private static synchronized void createInstance() {
if (instance == null) {
instance = new HttpPanelManager();
}
}
public void addRequestPanel(HttpPanel panel) {
requestPanels.addPanel(panel);
}
public void addRequestComponentFactory(HttpPanelComponentFactory componentFactory) {
requestPanels.addComponentFactory(componentFactory);
}
public void addRequestViewFactory(String componentName, HttpPanelViewFactory viewFactory) {
requestPanels.addViewFactory(componentName, viewFactory);
}
public void addRequestDefaultViewSelectorFactory(String componentName, HttpPanelDefaultViewSelectorFactory defaultViewSelectorFactory) {
requestPanels.addDefaultViewSelectorFactory(componentName, defaultViewSelectorFactory);
}
public void addResponsePanel(HttpPanel panel) {
responsePanels.addPanel(panel);
}
public void addResponseComponentFactory(HttpPanelComponentFactory componentFactory) {
responsePanels.addComponentFactory(componentFactory);
}
public void addResponseViewFactory(String componentName, HttpPanelViewFactory viewFactory) {
responsePanels.addViewFactory(componentName, viewFactory);
}
public void addResponseDefaultViewSelectorFactory(String componentName, HttpPanelDefaultViewSelectorFactory defaultViewSelectorFactory) {
responsePanels.addDefaultViewSelectorFactory(componentName, defaultViewSelectorFactory);
}
public void removeRequestPanel(HttpPanel panel) {
requestPanels.removePanel(panel);
}
public void removeRequestComponentFactory(String componentFactoryName) {
requestPanels.removeComponentFactory(componentFactoryName);
}
public void removeRequestComponents(String componentName) {
requestPanels.removeComponents(componentName);
}
public void removeRequestViewFactory(String componentName, String viewFactoryName) {
requestPanels.removeViewFactory(componentName, viewFactoryName);
}
public void removeRequestViews(String componentName, String viewName, Object options) {
requestPanels.removeViews(componentName, viewName, options);
}
public void removeRequestDefaultViewSelectorFactory(String componentName, String defaultViewSelectorFactoryName) {
requestPanels.removeDefaultViewSelectorFactory(componentName, defaultViewSelectorFactoryName);
}
public void removeRequestDefaultViewSelectorFactoryAndDefaultViewSelectorsAdded(String componentName, String defaultViewSelectorName, Object options) {
requestPanels.removeDefaultViewSelectors(componentName, defaultViewSelectorName, options);
}
public void removeResponsePanel(HttpPanel panel) {
responsePanels.removePanel(panel);
}
public void removeResponseComponentFactory(String componentFactoryName) {
responsePanels.removeComponentFactory(componentFactoryName);
}
public void removeResponseComponents(String componentName) {
responsePanels.removeComponents(componentName);
}
public void removeResponseViewFactory(String componentName, String viewFactoryName) {
responsePanels.removeViewFactory(componentName, viewFactoryName);
}
public void removeResponseViews(String componentName, String viewName, Object options) {
responsePanels.removeViews(componentName, viewName, options);
}
public void removeResponseDefaultViewSelectorFactory(String componentName, String defaultViewSelectorFactoryName) {
responsePanels.removeDefaultViewSelectorFactory(componentName, defaultViewSelectorFactoryName);
}
public void removeResponseDefaultViewSelectors(String componentName, String defaultViewSelectorName, Object options) {
responsePanels.removeDefaultViewSelectors(componentName, defaultViewSelectorName, options);
}
private static final class HttpPanelManagement {
private List<HttpPanel> panels;
private Map<String, HttpPanelComponentFactory> components;
private Map<String, Map<String, HttpPanelViewFactory>> views;
private Map<String, Map<String, HttpPanelDefaultViewSelectorFactory>> defaultViews;
public HttpPanelManagement() {
panels = new ArrayList<> ();
components = new HashMap<> ();
views = new HashMap<> ();
defaultViews = new HashMap<> ();
}
public void addPanel (HttpPanel panel) {
synchronized (this) {
this.panels.add(panel);
FileConfiguration fileConfiguration = Model.getSingleton().getOptionsParam().getConfig();
for (HttpPanelComponentFactory componentFactory : components.values()) {
panel.addComponent(componentFactory.getNewComponent(), fileConfiguration);
}
for (Map.Entry<String, Map<String, HttpPanelViewFactory>> componentViews : views.entrySet()) {
for(HttpPanelViewFactory viewFactory : componentViews.getValue().values() ) {
panel.addView(componentViews.getKey(), viewFactory.getNewView(), viewFactory.getOptions(), fileConfiguration);
}
}
for (Map.Entry<String, Map<String, HttpPanelDefaultViewSelectorFactory>> componentDefaultViews : defaultViews.entrySet()) {
for (HttpPanelDefaultViewSelectorFactory viewFactory : componentDefaultViews.getValue().values()) {
panel.addDefaultViewSelector(componentDefaultViews.getKey(), viewFactory.getNewDefaultViewSelector(), viewFactory.getOptions());
}
}
}
}
public void removePanel(HttpPanel panel) {
synchronized (this) {
this.panels.remove(panel);
}
}
public void addComponentFactory (HttpPanelComponentFactory componentFactory) {
synchronized (this) {
if (components.containsKey(componentFactory.getName())) {
return;
}
this.components.put(componentFactory.getName(), componentFactory);
FileConfiguration fileConfiguration = Model.getSingleton().getOptionsParam().getConfig();
for (HttpPanel panel : panels) {
panel.addComponent(componentFactory.getNewComponent(), fileConfiguration);
final String componentName = componentFactory.getComponentName();
Map<String, HttpPanelViewFactory> componentViews = views.get(componentName);
if (componentViews != null) {
for(HttpPanelViewFactory viewFactory : componentViews.values()) {
panel.addView(componentName, viewFactory.getNewView(), viewFactory.getOptions(), fileConfiguration);
}
}
Map<String, HttpPanelDefaultViewSelectorFactory> defaultViewsComp = defaultViews.get(componentName);
if (defaultViewsComp != null) {
for(HttpPanelDefaultViewSelectorFactory defaultViewSelector : defaultViewsComp.values()) {
panel.addDefaultViewSelector(componentName, defaultViewSelector.getNewDefaultViewSelector(), defaultViewSelector.getOptions());
}
}
}
}
}
public void removeComponentFactory(String componentFactoryName) {
synchronized (this) {
components.remove(componentFactoryName);
}
}
public void removeComponents(String componentName) {
synchronized (this) {
for (HttpPanel panel : panels) {
panel.removeComponent(componentName);
}
}
}
public void addViewFactory (String componentName, HttpPanelViewFactory viewFactory) {
synchronized (this) {
Map<String, HttpPanelViewFactory> componentViews = this.views.get(componentName);
if (componentViews == null) {
componentViews = new HashMap<> ();
this.views.put(componentName, componentViews);
} else if (views.containsKey(viewFactory.getName())) {
return;
}
componentViews.put(viewFactory.getName(), viewFactory);
FileConfiguration fileConfiguration = Model.getSingleton().getOptionsParam().getConfig();
for (HttpPanel panel : panels) {
panel.addView(componentName, viewFactory.getNewView(), viewFactory.getOptions(), fileConfiguration);
}
}
}
public void removeViewFactory(String componentName, String viewFactoryName) {
synchronized (this) {
Map<String, HttpPanelViewFactory> componentViews = this.views.get(componentName);
if (componentViews == null) {
return;
}
HttpPanelViewFactory viewFactory = componentViews.get(viewFactoryName);
if (viewFactory == null) {
return;
}
componentViews.remove(viewFactoryName);
if (componentViews.isEmpty()) {
this.views.put(componentName, null);
}
}
}
public void removeViews(String componentName, String viewName, Object options) {
synchronized (this) {
for (HttpPanel panel : panels) {
panel.removeView(componentName, viewName, options);
}
}
}
public void addDefaultViewSelectorFactory(String componentName, HttpPanelDefaultViewSelectorFactory defaultViewSelectorFactory) {
synchronized (this) {
Map<String, HttpPanelDefaultViewSelectorFactory> componentDefaultViews = this.defaultViews.get(componentName);
if (componentDefaultViews == null) {
componentDefaultViews = new HashMap<> ();
this.defaultViews.put(componentName, componentDefaultViews);
} else if (views.containsKey(defaultViewSelectorFactory.getName())) {
return;
}
componentDefaultViews.put(defaultViewSelectorFactory.getName(), defaultViewSelectorFactory);
for (HttpPanel panel : panels) {
panel.addDefaultViewSelector(componentName, defaultViewSelectorFactory.getNewDefaultViewSelector(), defaultViewSelectorFactory.getOptions());
}
}
}
public void removeDefaultViewSelectorFactory(String componentName, String viewFactoryName) {
synchronized (this) {
Map<String, HttpPanelDefaultViewSelectorFactory> componentDefaultViews = this.defaultViews.get(componentName);
if (componentDefaultViews == null) {
return;
}
HttpPanelDefaultViewSelectorFactory viewFactory = componentDefaultViews.get(viewFactoryName);
if (viewFactory == null) {
return;
}
componentDefaultViews.remove(viewFactoryName);
if (componentDefaultViews.isEmpty()) {
this.defaultViews.put(componentName, null);
}
}
}
public void removeDefaultViewSelectors(String componentName, String defaultViewSelectorName, Object options) {
synchronized (this) {
for (HttpPanel panel : panels) {
panel.removeDefaultViewSelector(componentName, defaultViewSelectorName, options);
}
}
}
}
public interface HttpPanelComponentFactory {
String getName();
String getComponentName();
HttpPanelComponentInterface getNewComponent();
}
public interface HttpPanelViewFactory {
String getName();
HttpPanelView getNewView();
Object getOptions();
}
public interface HttpPanelDefaultViewSelectorFactory {
String getName();
HttpPanelDefaultViewSelector getNewDefaultViewSelector();
Object getOptions();
}
}