// www.thinkmiddleware.com
// JAAS/LDAP Authentication Tutorial
// LoginExample.java
// 22 Nov 2008
// Notes:
//
//Per license requriments, the original copy right notice is included
//below.
//
// Contact 01@thinkmiddleware.com with questions.
//
/*
 * @(#)SampleAcn.java
 *
 * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * -Redistributions of source code must retain the above copyright
 * notice, this  list of conditions and the following disclaimer.
 *
 * -Redistribution in binary form must reproduct the above copyright
 * notice, this list of conditions and the following disclaimer in
 * the documentation and/or other materials provided with the
 * distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any
 * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
 * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
 * DAMAGES OR LIABILITIES  SUFFERED BY LICENSEE AS A RESULT OF  OR
 * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
 * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
 * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
 * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
 * THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that Software is not designed, licensed or
 * intended for use in the design, construction, operation or
 * maintenance of any nuclear facility.
 */

package com.tm.jaas;

import java.util.*;
import javax.security.auth.login.*;
import javax.security.auth.*;
import java.security.Principal;

public class LoginExample
{
    LoginContext lc = null;
    public LoginExample()
      throws Exception
    {
      try {
        lc = new LoginContext("ThinkMiddleware", new TMCallbackHandler());
      } catch (Exception e)  {
        e.printStackTrace();
        throw e;
      }
      
    }
    public static void main(String[] args) 
    {
      try {
        LoginExample le = new LoginExample();
        le.authenticate();
      } catch (Exception e) {
        e.printStackTrace(); 
      }
    }
  
    public void authenticate()
    {
	try 
        {
	  lc.login();
	  System.out.println("Authentication Succeeded");
	} catch (Exception e) {
          e.printStackTrace();
          return;
	}
        dumpSubject();
    }
  
    public void dumpSubject()
    {
	//Dump JAAS Subject contents...
	Subject subject = lc.getSubject();
        System.out.println("Full dump of JAAS Subject");
        System.out.println("JAAS Subject: " + subject);
        Set<Principal> principals = subject.getPrincipals();
        Iterator<Principal> principalsIter = principals.iterator();
        while(principalsIter.hasNext())
        {
          Principal p = principalsIter.next();
          System.out.println("Principal: " + p.getName());
        }
        System.out.println("Public Credentials: ");
	Set publicCredentials = subject.getPublicCredentials();
        Iterator publicCredentialsIter = publicCredentials.iterator();
        while(publicCredentialsIter.hasNext())
        {
           Object pc = publicCredentialsIter.next();
           if(pc != null)
           {
             System.out.println("Public Credential Classname: " + pc.getClass().toString());
 	     System.out.println("Public Credential: " + pc.toString());
           } else {
             System.out.println("Null object");
           }
        }
        System.out.println("Private Credentials: ");
        Set privateCredentials = subject.getPrivateCredentials();
        Iterator privateCredentialsIter = privateCredentials.iterator();
        while(privateCredentialsIter.hasNext())
        {
           Object pc = privateCredentialsIter.next();
           if(pc != null)
           {
             System.out.println("Private Credential: " + pc.toString());
           } else {
             System.out.println("Null object");
           }
        }
	try {
          lc.logout();
        } catch(Exception e) {
          e.printStackTrace();
        }
    }
}
