/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.wicket.settings;
import org.apache.wicket.Application;
import org.apache.wicket.Component;
import org.apache.wicket.authentication.IAuthenticationStrategy;
import org.apache.wicket.authentication.strategy.DefaultAuthenticationStrategy;
import org.apache.wicket.authorization.IAuthorizationStrategy;
import org.apache.wicket.authorization.IUnauthorizedComponentInstantiationListener;
import org.apache.wicket.authorization.IUnauthorizedResourceRequestListener;
import org.apache.wicket.authorization.UnauthorizedInstantiationException;
import org.apache.wicket.core.util.crypt.KeyInSessionSunJceCryptFactory;
import org.apache.wicket.util.crypt.ICryptFactory;
import org.apache.wicket.util.lang.Args;
/**
* Class for security related settings
*
* @author Jonathan Locke
* @author Chris Turner
* @author Eelco Hillenius
* @author Juergen Donnerstag
* @author Johan Compagner
* @author Igor Vaynberg (ivaynberg)
* @author Martijn Dashorst
* @author James Carman
*/
public class SecuritySettings
{
/**
* encryption key used by default crypt factory
*/
public static final String DEFAULT_ENCRYPTION_KEY = "WiCkEt-FRAMEwork";
/** The authorization strategy. */
private IAuthorizationStrategy authorizationStrategy = IAuthorizationStrategy.ALLOW_ALL;
/** The authentication strategy. */
private IAuthenticationStrategy authenticationStrategy;
/** factory for creating crypt objects */
private ICryptFactory cryptFactory;
/**
* Whether mounts should be enforced. If {@code true}, requests for a page will be
* allowed only if the page has been explicitly mounted in {@link Application#init() MyApplication#init()}.
*
* This setting basically disables {@link org.apache.wicket.core.request.mapper.BookmarkableMapper}
*/
private boolean enforceMounts = false;
/** Authorizer for component instantiations */
private static final IUnauthorizedComponentInstantiationListener DEFAULT_UNAUTHORIZED_COMPONENT_INSTANTIATION_LISTENER = new IUnauthorizedComponentInstantiationListener()
{
/**
* Called when an unauthorized component instantiation is about to take place (but before it
* happens).
*
* @param component
* The partially constructed component (only the id is guaranteed to be valid).
*/
@Override
public void onUnauthorizedInstantiation(final Component component)
{
throw new UnauthorizedInstantiationException(component.getClass());
}
};
private IUnauthorizedComponentInstantiationListener unauthorizedComponentInstantiationListener =
DEFAULT_UNAUTHORIZED_COMPONENT_INSTANTIATION_LISTENER;
private static final IUnauthorizedResourceRequestListener DEFAULT_UNAUTHORIZED_RESOURCE_REQUEST_LISTENER =
new DefaultUnauthorizedResourceRequestListener();
private IUnauthorizedResourceRequestListener unauthorizedResourceRequestListener = DEFAULT_UNAUTHORIZED_RESOURCE_REQUEST_LISTENER;
/**
* Gets the authorization strategy.
*
* @return Returns the authorizationStrategy.
*/
public IAuthorizationStrategy getAuthorizationStrategy()
{
return authorizationStrategy;
}
/**
* Note: Prints a warning to stderr if no factory was set and {@link #DEFAULT_ENCRYPTION_KEY} is
* used instead.
*
* @return crypt factory used to generate crypt objects
*/
public synchronized ICryptFactory getCryptFactory()
{
if (cryptFactory == null)
{
cryptFactory = new KeyInSessionSunJceCryptFactory();
}
return cryptFactory;
}
/**
* Gets whether page mounts should be enforced. If {@code true}, requests for a page will be
* allowed only if the page has been explicitly mounted in {@link Application#init() MyApplication#init()}.
*
* This setting basically disables {@link org.apache.wicket.core.request.mapper.BookmarkableMapper}
*
* @return Whether mounts should be enforced
*/
public boolean getEnforceMounts()
{
return enforceMounts;
}
/**
* @return The listener
* @see IUnauthorizedComponentInstantiationListener
*/
public IUnauthorizedComponentInstantiationListener getUnauthorizedComponentInstantiationListener()
{
return unauthorizedComponentInstantiationListener;
}
/**
* Sets the authorization strategy.
*
* @param strategy
* new authorization strategy
* @return {@code this} object for chaining
*/
public SecuritySettings setAuthorizationStrategy(IAuthorizationStrategy strategy)
{
Args.notNull(strategy, "strategy");
authorizationStrategy = strategy;
return this;
}
/**
* Sets the factory that will be used to create crypt objects. The crypt object returned from
* the first call is cached.
*
* @param cryptFactory
* @return {@code this} object for chaining
*/
public SecuritySettings setCryptFactory(ICryptFactory cryptFactory)
{
Args.notNull(cryptFactory, "cryptFactory");
this.cryptFactory = cryptFactory;
return this;
}
/**
* Sets whether mounts should be enforced. If true, requests for mounted targets have to done
* through the mounted paths. If, for instance, a bookmarkable page is mounted to a path, a
* request to that same page via the bookmarkablePage parameter will be denied.
*
* @param enforce
* Whether mounts should be enforced
* @return {@code this} object for chaining
*/
public SecuritySettings setEnforceMounts(boolean enforce)
{
enforceMounts = enforce;
return this;
}
/**
* @param listener
* The listener to set
* @see IUnauthorizedComponentInstantiationListener
* @return {@code this} object for chaining
*/
public SecuritySettings setUnauthorizedComponentInstantiationListener(
IUnauthorizedComponentInstantiationListener listener)
{
this.unauthorizedComponentInstantiationListener = listener == null ?
DEFAULT_UNAUTHORIZED_COMPONENT_INSTANTIATION_LISTENER :
listener;
return this;
}
/**
* @return The listener that will be used when a request to an IResource is not allowed for some reason
*/
public IUnauthorizedResourceRequestListener getUnauthorizedResourceRequestListener()
{
return unauthorizedResourceRequestListener;
}
/**
* Sets a listener that will be used when a request to an IResource is not allowed for some reason
*
* @param listener
* The listener
* @return {@code this} object for chaining
*/
public SecuritySettings setUnauthorizedResourceRequestListener(IUnauthorizedResourceRequestListener listener)
{
this.unauthorizedResourceRequestListener = listener == null ?
DEFAULT_UNAUTHORIZED_RESOURCE_REQUEST_LISTENER :
listener;
return this;
}
/**
* Gets the authentication strategy.
*
* @return Returns the authentication strategy.
*/
public IAuthenticationStrategy getAuthenticationStrategy()
{
if (authenticationStrategy == null)
{
authenticationStrategy = new DefaultAuthenticationStrategy("LoggedIn");
}
return authenticationStrategy;
}
/**
* Sets the authentication strategy.
*
* @param strategy
* new authentication strategy
* @return {@code this} object for chaining
*/
public SecuritySettings setAuthenticationStrategy(final IAuthenticationStrategy strategy)
{
authenticationStrategy = strategy;
return this;
}
}