/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2013 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.zap.extension.authorization;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.db.DatabaseException;
import org.parosproxy.paros.db.RecordContext;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.extension.ExtensionHook;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.model.Session;
import org.zaproxy.zap.model.Context;
import org.zaproxy.zap.model.ContextDataFactory;
import org.zaproxy.zap.view.AbstractContextPropertiesPanel;
import org.zaproxy.zap.view.ContextPanelFactory;
/**
* The Authorization Extension allows ZAP users to define how authorized/unauthorized requests to
* web applications are identified.
*/
public class ExtensionAuthorization extends ExtensionAdaptor implements ContextPanelFactory,
ContextDataFactory {
/** The Constant log. */
private static final Logger log = Logger.getLogger(ExtensionAuthorization.class);
/** The NAME of the extension. */
public static final String NAME = "ExtensionAuthorization";
/** The map of context panels. */
private Map<Integer, ContextAuthorizationPanel> contextPanelsMap = new HashMap<>();
/**
* Instantiates the extension.
*/
public ExtensionAuthorization() {
super();
initialize();
}
/**
* Initialize the extension.
*/
private void initialize() {
this.setName(NAME);
this.setOrder(205);
}
@Override
public void hook(ExtensionHook extensionHook) {
super.hook(extensionHook);
// Register this where needed
Model.getSingleton().addContextDataFactory(this);
if (getView() != null) {
// Factory for generating Session Context UserAuth panels
getView().addContextPanelFactory(this);
}
extensionHook.addApiImplementor(new AuthorizationAPI());
}
@Override
public AbstractContextPropertiesPanel getContextPanel(Context context) {
ContextAuthorizationPanel panel = this.contextPanelsMap.get(context.getIndex());
if (panel == null) {
panel = new ContextAuthorizationPanel(this, context.getIndex());
this.contextPanelsMap.put(context.getIndex(), panel);
}
return panel;
}
@Override
public void discardContexts() {
this.contextPanelsMap.clear();
}
@Override
public void discardContext(Context ctx) {
this.contextPanelsMap.remove(ctx.getIndex());
}
@Override
public void loadContextData(Session session, Context context) {
try {
List<String> loadedData = session.getContextDataStrings(context.getIndex(),
RecordContext.TYPE_AUTHORIZATION_METHOD_TYPE);
if (loadedData != null && loadedData.size() > 0) {
int type = Integer.parseInt(loadedData.get(0));
// Based on the type, call the appropriate method loader
switch (type) {
case BasicAuthorizationDetectionMethod.METHOD_UNIQUE_ID:
context.setAuthorizationDetectionMethod(BasicAuthorizationDetectionMethod
.loadMethodFromSession(session, context.getIndex()));
break;
}
}
} catch (DatabaseException e) {
log.error("Unable to load Authorization Detection method.", e);
}
}
@Override
public void persistContextData(Session session, Context context) {
try {
// Persist the method type first and then the method data itself
int type = context.getAuthorizationDetectionMethod().getMethodUniqueIdentifier();
session.setContextData(context.getIndex(), RecordContext.TYPE_AUTHORIZATION_METHOD_TYPE,
Integer.toString(type));
context.getAuthorizationDetectionMethod().persistMethodToSession(session, context.getIndex());
} catch (DatabaseException e) {
log.error("Unable to persist Authorization Detection method.", e);
}
}
@Override
public URL getURL() {
try {
return new URL(Constant.ZAP_HOMEPAGE);
} catch (MalformedURLException e) {
return null;
}
}
@Override
public String getAuthor() {
return Constant.ZAP_TEAM;
}
@Override
public void exportContextData(Context ctx, Configuration config) {
config.setProperty(AuthorizationDetectionMethod.CONTEXT_CONFIG_AUTH_TYPE, ctx
.getAuthorizationDetectionMethod().getMethodUniqueIdentifier());
ctx.getAuthorizationDetectionMethod().exportMethodData(config);
}
@Override
public void importContextData(Context ctx, Configuration config) throws ConfigurationException {
int type = config.getInt(AuthorizationDetectionMethod.CONTEXT_CONFIG_AUTH_TYPE);
switch (type) {
case BasicAuthorizationDetectionMethod.METHOD_UNIQUE_ID:
ctx.setAuthorizationDetectionMethod(new BasicAuthorizationDetectionMethod(config));
break;
}
}
}