import javax.net.ssl.*;
import javax.security.cert.*;

/**
 *      AutentificadorCN	
 *
 *      Implementación de la interfaz AutentificadorSSL, proporcionando
 *      un mecanismo para comprobar que el certificado usado en la 
 *      autentificación es un certificado con CN=demo.
 *
 */
public class AutentificadorCN implements AutentificadorSSL
 {

	private SSLSession mSession;

	public AutentificadorCN (SSLSession session) {
		mSession = session;
	}

	public void comprobarPermiso() throws ExcepcionAutentificacion {

	System.out.println(mSession.getCipherSuite());

                // 1. Obtener la secuencia de certificados.
		X509Certificate[] certChain = null;
		try {
			certChain = mSession.getPeerCertificateChain();
		} catch (SSLPeerUnverifiedException spue) {
			// No hay! 
			throw new ExcepcionAutentificacion("Error cadena");
		}
                // 2. Obtener el certificado del cliente
		X509Certificate clientCert = certChain[0];
                // 3. Obtener el principal correspondiente al cliente
		java.security.Principal client = clientCert.getSubjectDN();
                // 4. Obtener el nombre del cliente
		String name = client.getName();
                // 5. Comprobar que CN=demo
		if (name.indexOf("CN=demo,")!=0) {
			throw new ExcepcionAutentificacion("Cliente no es demo");
		}

		//System.out.println("Nombre del cliente: " + name);
	}
}
