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

org.subethamail.smtp.auth.MultipleAuthenticationHandlerFactory Maven / Gradle / Ivy

There is a newer version: 3.1.7
Show newest version
package org.subethamail.smtp.auth;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.subethamail.smtp.AuthenticationHandler;
import org.subethamail.smtp.AuthenticationHandlerFactory;
import org.subethamail.smtp.RejectException;

/**
 * This handler combines the behavior of several other authentication handler factories.
 *
 * @author Jeff Schnitzer
 */
public class MultipleAuthenticationHandlerFactory implements AuthenticationHandlerFactory
{
	/** Maps the auth type (eg "PLAIN") to a handler */
	Map plugins = new HashMap();

	/** A more orderly list of the supported mechanisms */
	List mechanisms = new ArrayList();

	/** */
	public MultipleAuthenticationHandlerFactory()
	{
		// Starting with an empty list is ok, let the user add them all
	}

	/** */
	public MultipleAuthenticationHandlerFactory(Collection factories)
	{
		for (AuthenticationHandlerFactory fact: factories)
		{
			this.addFactory(fact);
		}
	}

	/** */
	public void addFactory(AuthenticationHandlerFactory fact)
	{
		List partialMechanisms = fact.getAuthenticationMechanisms();
		for (String mechanism: partialMechanisms)
		{
			if (!this.mechanisms.contains(mechanism))
			{
				this.mechanisms.add(mechanism);
				this.plugins.put(mechanism, fact);
			}
		}
	}

	/** */
	public List getAuthenticationMechanisms()
	{
		return this.mechanisms;
	}

	/** */
	public AuthenticationHandler create()
	{
		return new Handler();
	}

	/**
	 */
	class Handler implements AuthenticationHandler
	{
		AuthenticationHandler active;

		/* */
		public String auth(String clientInput) throws RejectException
		{
			if (this.active == null)
			{
				StringTokenizer stk = new StringTokenizer(clientInput);
				String auth = stk.nextToken();
				if (!"AUTH".equals(auth))
					throw new IllegalArgumentException("Not an AUTH command: " + clientInput);

				String method = stk.nextToken();
				AuthenticationHandlerFactory fact = MultipleAuthenticationHandlerFactory.this.plugins.get(method);

				if (fact == null)
					throw new RejectException(504, "Method not supported");

				this.active = fact.create();
			}

			return this.active.auth(clientInput);
		}

		/* */
		public Object getIdentity()
		{
			return this.active.getIdentity();
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy