//Author: 01
//File: SubjectServlet.java
//Dalte: 1 Jun 2009
//
//Thinkmiddleware.com
//
//Use at your own risk.  See Thinkmiddleare.com for additional disclaimers.
//
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import javax.security.auth.login.*;
import javax.security.auth.*;
import java.security.Principal;
import org.jboss.security.SecurityAssociation;
import org.jboss.security.SimpleGroup;

public class SubjectServlet extends HttpServlet
{

  public SubjectServlet() {}

  public void doService(HttpServletRequest req, HttpServletResponse res)
  {
    try {
      PrintWriter pw = res.getWriter();
      pw.println("<HTML>");
      pw.println("<HEAD>");
      pw.println("<TITLE>JAAS Subject</TITLE>");
      pw.println("</HEAD>");
      pw.println("<BODY>");
      dumpSubject(pw);
      pw.println("</BODY>");
      pw.println("</HTML>");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public void doGet( HttpServletRequest req, HttpServletResponse res)
  {
    doService(req,res);
  }

   public void dumpSubject(PrintWriter pw)
   {
        //Dump JAAS Subject contents...
        Subject subject =  SecurityAssociation.getSubject();
        pw.println("<H1>Full dump of JAAS Subject</H1>");
        pw.println("<P>JAAS Subject: " + subject + "</P>");
        Set<Principal> principals = subject.getPrincipals();
        Iterator<Principal> principalsIter = principals.iterator();
        pw.println("<H2>Principals</H2>");
        while(principalsIter.hasNext())
        {
          Principal p = principalsIter.next();
          pw.println("<P>Principal: " + p.getName() + "</P>");
          pw.println("<P>Principal Classname: "  + p.getClass().getName() + "</p>");
          if ( p instanceof SimpleGroup)
          {
             Enumeration e = ((org.jboss.security.SimpleGroup)p).members();
             while(e.hasMoreElements())
             {
               pw.println("<P>Member: " + e.nextElement() + "</P>");
             }
           }
        }
        pw.println("<h2>Public Credentials:</h2>");
        Set publicCredentials = subject.getPublicCredentials();
        Iterator publicCredentialsIter = publicCredentials.iterator();
        while(publicCredentialsIter.hasNext())
        {
           Object pc = publicCredentialsIter.next();
           if(pc != null)
           {
             pw.println("<P>Public Credential Classname: " + pc.getClass().toString() + "</P>");
             pw.println("<P>Public Credential: " + pc.toString() + "</P>");
           } else {
             pw.println("<P>Null object</P>");
           }
        }
        pw.println("<h2>Private Credentials:</h2>");
        Set privateCredentials = subject.getPrivateCredentials();
        Iterator privateCredentialsIter = privateCredentials.iterator();
        while(privateCredentialsIter.hasNext())
        {
           Object pc = privateCredentialsIter.next();
           if(pc != null)
           {
             pw.println("<h2>Private Credential: " + pc.toString() + "</h2>");
           } else {
             pw.println("<h2>Null object</h2>");
           }
        }
   }
}
