/*
 * @(#)SearchRetAll.java	1.6 00/04/28
 *
 * [Revised by kam@stanford.edu to demonstrate searching
 * Stanford's public directory.
 * No warranty.]
 *
 * Copyright 1997, 1998, 1999 Sun Microsystems, Inc. All Rights
 * Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free,
 * license to use, modify and redistribute this software in source and
 * binary code form, provided that i) this copyright notice and license
 * appear on all copies of the software; and ii) Licensee does not
 * utilize the software in a manner which is disparaging to Sun.
 *
 * 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 SUFFERED BY LICENSEE AS A RESULT OF USING,
 * MODIFYING OR DISTRIBUTING 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.
 *
 * This software is not designed or intended for use in on-line
 * control of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and warrants
 * that it will not use or redistribute the Software for such purposes.
 */

import javax.naming.*;
import javax.naming.directory.*;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

import java.util.Hashtable;

/**
 * Demonstrates how to perform a search
 * usage: java -Djava.security.auth.login.config=loginconfigfilepath -Djava.security.krb5.conf=/etc/leland/krb5.conf SearchRequiringAuth
 */
class SearchRequiringAuth {
    public static void main(String[] args) throws Exception {


		LoginContext loginCtx = establishLoginContext();

		loginCtx.login();

   		 NamingEnumeration ne =
   			(NamingEnumeration) Subject.doAs(loginCtx.getSubject(),
   				new SearchAction());

    	SearchResultPrinter.printSearchEnumeration(ne);
    }


    static LoginContext establishLoginContext() throws LoginException {
		LoginContext  loginCtx = new LoginContext("MyAppName");
		return loginCtx;

      }

}

class SearchAction implements java.security.PrivilegedAction {

	public Object run() {

        // Set up the environment for creating the initial context
        Hashtable env = new Hashtable(11);
        env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");

        env.put(Context.PROVIDER_URL, "ldap://ldap.stanford.edu:389/");
        env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");
        env.put("javax.security.sasl.qop", "auth-conf");

        DirContext ctx = null;
        try {
           // Create initial context
           ctx = new InitialDirContext(env);

           SearchControls ctls = new SearchControls();
           ctls.setReturningAttributes(
                 new String[] {"displayName", "mail","description", "suSunetID"});

           NamingEnumeration answer =
                ctx.search("cn=People, dc=Stanford, dc=EDU",
                                 "(&(cn=k*)(sn=murray))", ctls);

			return answer;


        } catch (Exception e) {
               e.printStackTrace();
        }
         // Close the context when we're done
        finally {
            closeContext(ctx);
        }
	   	return null;
    }

    public static void closeContext(DirContext ctx)  {
         if (!(ctx == null)) {
              try {
                      ctx.close();
              }
              catch (Exception closeProblem) {
                       System.err.println("error closing Context - " + closeProblem.getMessage());
              }
          }
      }
}
