All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.openapi.provider.SecurityProviderManager Maven / Gradle / Ivy

package aQute.openapi.provider;

import static aQute.openapi.security.api.OpenAPIAuthenticator.NAME;
import static aQute.openapi.security.api.OpenAPIAuthenticator.TYPE;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.Servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import aQute.json.codec.JSONCodec;
import aQute.openapi.security.api.OpenAPIAuthenticator;
import aQute.openapi.security.api.OpenAPISecurityProviderInfo;

@Component(service = {
		Servlet.class, SecurityProviderManager.class
}, property = HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN + "="
		+ SecurityProviderManager.PATTERN, configurationPid = SecurityProviderManager.PID)
public class SecurityProviderManager extends HttpServlet {
	public static final String				PID					= "aQute.openapi.security.manager";
	public static final String				PATTERN				= "/.openapi/security/*";
	final static Logger						logger				= LoggerFactory
			.getLogger(SecurityProviderManager.class);
	final static JSONCodec					json				= new JSONCodec();
	private static final long				serialVersionUID	= 1L;
	final Map	providers			= new ConcurrentHashMap();

	@Override
	public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {

		try {
			String path = request.getPathInfo();

			if (path == null) {
				if (!request.getMethod().equalsIgnoreCase("GET")) {
					response.sendError(HttpServletResponse.SC_BAD_REQUEST);
					return;
				}
				List result = new ArrayList<>();
				for (OpenAPIAuthenticator provider : providers.values()) {
					OpenAPISecurityProviderInfo info = provider.getInfo(request);
					if (info != null)
						result.add(info);
				}
				String answer = json.enc().put(result).toString();
				response.setContentType("application/json");
				response.getWriter().write(answer);
				response.getWriter().close();
				return;
			}

			String parts[] = path.split("/");

			if (parts.length == 4) {

				String providerId = parts[1];
				String providerType = parts[2];
				String command = parts[3];

				OpenAPIAuthenticator securityProvider = getSecurityProvider(providerId, providerType);
				if (securityProvider == null) {
					response.sendError(HttpServletResponse.SC_NOT_FOUND);
					return;
				}

				URI redirect;
				switch (command) {
					case "login" :
						redirect = securityProvider.login(request, response);
						break;
					case "logout" :
						redirect = securityProvider.logout(request, response);
						break;

					default :
						redirect = securityProvider.other(command, request, response);
						break;
				}
				if (redirect != null) {
					response.sendRedirect(response.encodeRedirectURL(redirect.toString()));
				}
				// else should be handled by the securityProvider
			}
		} catch (Exception e) {
			logger.error("Unexpected", e);
		}
	}

	private OpenAPIAuthenticator getSecurityProvider(String providerId, String providerType) {
		String key = getKey(providerId, providerType);
		return providers.get(key);
	}

	@Reference(cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
	void addSecurityProvider(OpenAPIAuthenticator provider, Map properties) {
		String key = getKey(properties.get(NAME), properties.get(TYPE));
		providers.put(key, provider);
	}

	void removeSecurityProvider(OpenAPIAuthenticator provider, Map properties) {
		String key = getKey(properties.get(NAME), properties.get(TYPE));
		providers.remove(key);
	}

	protected String getKey(Object name, Object type) {
		assert name != null;
		assert type != null;
		String key = name + ":" + type;
		return key;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy