blob: 91f63ccdfd5c33bb507d3d568a9a169236783b9d [file] [log] [blame]
/*
* 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.sling.auth.core.impl;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.auth.core.spi.AuthenticationFeedbackHandler;
import org.apache.sling.auth.core.spi.AuthenticationHandler;
import org.apache.sling.auth.core.spi.AuthenticationInfo;
import org.osgi.framework.ServiceReference;
/**
* The <code>AbstractAuthenticationHandlerHolder</code> is a base class to
* represent authentication handlers (both legacy and new ones) for use in the
* {@link SlingAuthenticator}.
*/
public abstract class AbstractAuthenticationHandlerHolder extends
PathBasedHolder implements AuthenticationHandler {
protected AbstractAuthenticationHandlerHolder(final String fullPath,
final ServiceReference serviceReference) {
super(fullPath, serviceReference);
}
/**
* Sets the {@link AuthenticationHandler#PATH_PROPERTY} request attribute to
* this {@link PathBasedHolder#fullPath} and calls the
* {@link #extractCredentials(HttpServletRequest, HttpServletResponse)} to
* have the credentials extracted from the request.
*
* @param request the current request
* @param response the current response
* @return the result of calling
* {@link #doExtractCredentials(HttpServletRequest, HttpServletResponse)}
*/
public final AuthenticationInfo extractCredentials(
HttpServletRequest request, HttpServletResponse response) {
final Object oldPathAttr = setPath(request);
try {
return doExtractCredentials(request, response);
} finally {
resetPath(request, oldPathAttr);
}
}
/**
* Sets the {@link AuthenticationHandler#PATH_PROPERTY} request attribute to
* this {@link PathBasedHolder#fullPath} and calls the
* {@link #doRequestCredentials(HttpServletRequest, HttpServletResponse)} to
* have the credentials requested from the client.
*
* @param request the current request
* @param response the current response
* @return the result of calling
* {@link #doRequestCredentials(HttpServletRequest, HttpServletResponse)}
* @throws IOException if an error occurs interacting with the client
*/
public final boolean requestCredentials(HttpServletRequest request,
HttpServletResponse response) throws IOException {
final Object oldPathAttr = setPath(request);
try {
return doRequestCredentials(request, response);
} finally {
resetPath(request, oldPathAttr);
}
}
/**
* Sets the {@link AuthenticationHandler#PATH_PROPERTY} request attribute to
* this {@link PathBasedHolder#fullPath} and calls the
* {@link #doDropCredentials(HttpServletRequest, HttpServletResponse)} to
* have the credentials dropped by the held authentication handler.
*
* @param request the current request
* @param response the current response
* @throws IOException if an error occurs interacting with the client
*/
public final void dropCredentials(HttpServletRequest request,
HttpServletResponse response) throws IOException {
final Object oldPathAttr = setPath(request);
try {
doDropCredentials(request, response);
} finally {
resetPath(request, oldPathAttr);
}
}
// --------- API to be implemented
/**
* Returns a feedback handler provided by the authentication handler held by
* this instance or <code>null</code> if none is provided.
*/
protected abstract AuthenticationFeedbackHandler getFeedbackHandler();
/**
* Calls the actual authentication handler to extract the credentials from
* the request.
*
* @param request The current request
* @param response The current response
* @return as returned from the called authentication handler
* @see #extractCredentials(HttpServletRequest, HttpServletResponse)
*/
protected abstract AuthenticationInfo doExtractCredentials(
HttpServletRequest request, HttpServletResponse response);
/**
* Calls the actual authentication handler to request the credentials from
* the client.
*
* @param request The current request
* @param response The current response
* @return as returned from the called authentication handler
* @throws IOException if an error occurs sending back any response to the
* client.
* @see #requestCredentials(HttpServletRequest, HttpServletResponse)
*/
protected abstract boolean doRequestCredentials(HttpServletRequest request,
HttpServletResponse response) throws IOException;
/**
* Calls the actual authentication handler to request the credentials from
* the client.
*
* @param request The current request
* @param response The current response
* @throws IOException if an error occurs sending back any response to the
* client.
* @see #dropCredentials(HttpServletRequest, HttpServletResponse)
*/
protected abstract void doDropCredentials(HttpServletRequest request,
HttpServletResponse response) throws IOException;
// ---------- internal
/**
* Sets the {@link PathBasedHolder#fullPath} as the
* {@link AuthenticationHandler#PATH_PROPERTY} request attribute.
*/
private Object setPath(final HttpServletRequest request) {
return setRequestAttribute(request,
AuthenticationHandler.PATH_PROPERTY, fullPath);
}
/**
* Sets the given <code>odlValue</code> as the
* {@link AuthenticationHandler#PATH_PROPERTY} request attribute.
*/
private void resetPath(final HttpServletRequest request, Object oldValue) {
setRequestAttribute(request, AuthenticationHandler.PATH_PROPERTY,
oldValue);
}
/**
* Sets the named request attribute to the new value and returns the
* previous value.
*
* @param request The request object whose attribute is to be set.
* @param name The name of the attribute to be set.
* @param value The new value of the attribute. If this is <code>null</code>
* the attribute is actually removed from the request.
* @return The previous value of the named request attribute or
* <code>null</code> if it was not set.
*/
private static Object setRequestAttribute(HttpServletRequest request,
String name, Object value) {
Object oldValue = request.getAttribute(name);
if (value == null) {
request.removeAttribute(name);
} else {
request.setAttribute(name, value);
}
return oldValue;
}
}