/* * UserAuthenticate.java * Bean containing methods related to connecting to the directory and tracking a user * Created on May 16, 2002, 12:00 PM * Last Modified: Oct 2002 -- NJS */ package login; import java.beans.*; import javax.servlet.*; import javax.servlet.http.*; import javax.naming.*; import javax.naming.directory.*; import java.lang.*; import java.util.*; import ldap.GroupManagement; import log.Tools; /** * * @author Nicole Swan * @version 1.1 */ public class UserAuthenticate implements java.io.Serializable{ private String userid; private String password; private String fullName; private String authority; /** Creates new userAuthenticate */ public UserAuthenticate() { userid = null; password = null; fullName = null; authority = null; } //GET METHODS public String getUserid () { return userid; } public String getPassword () { return password; } public String getFullName( ){ return fullName; } public String getAuthority(){ return authority; } //SET METHODS public void setUserid (String userid) { if(userid!=null){ userid = userid.toLowerCase(); } this.userid = userid; } public void setPassword (String password) { this.password = password; } public void setFullName( String name) { this.fullName = name; } public void setAuthority( String authority){ this.authority = authority; } /************************************************************************ ** Given a userid and password, authenticates to the directory ************************************************************************/ public boolean ldapAuthenticate(){ return ldapAuthenticate(userid, password); } public boolean ldapAuthenticate(String userid, String password) { if ( userid == null || password == null ) { return false; } String dn = getDN(userid); if ( dn == null) return false; dn = dn + ",o=usd.edu"; //System.out.println(dn); String ldap_url = "ldap://ldap.usd.edu:389/o=usd.edu"; //set variables for context Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldap_url); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, dn); env.put(Context.SECURITY_CREDENTIALS, password); DirContext ctx; //make connection, catch errors thrown try { ctx = new InitialDirContext(env); } catch (AuthenticationException e){ System.out.println(util.Tools.getLoggingDate() + " ldapAuthenticate() Authentication Exception: " + e); return false; } catch (NamingException e) { System.out.println(util.Tools.getLoggingDate() + " ldapAuthenticate() Naming Exception: " + e ); return false; } //GET FULL NAME fullName = getFullNameByUsername(userid);//get full name //close connection try{ ctx.close(); } catch (NamingException ne){ System.out.println(util.Tools.getLoggingDate() + " ldapAuthenticate() Error: " + ne); } return true; } //GET THE FULL NAME GIVEN A USERNAME public String getFullNameByUsername(String username){ if(username==null){ return ""; } String fullName = ""; String ldap_url = "ldap://ldap.usd.edu:389/o=usd.edu"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldap_url); DirContext ctx; try { ctx = new InitialDirContext(env); SearchControls ctls = new SearchControls(); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); String[] attrs = { "gecos" }; ctls.setReturningAttributes(attrs); String filter = "(uid=" + username + ")"; // Search for objects with these matching attributes NamingEnumeration results = ctx.search("",filter,ctls); if ( results != null && results.hasMoreElements()) { SearchResult sr = (SearchResult)results.nextElement(); Attributes readAttr = sr.getAttributes(); Attribute attr=readAttr.get("gecos"); fullName = (String)attr.get(); }else{ return ""; } ctx.close(); } catch (AuthenticationException e){ System.out.println(util.Tools.getLoggingDate() + " getFullnameByUsername() Authentication Exception: " + e); return null; } catch (NamingException e) { System.out.println(util.Tools.getLoggingDate() + " getFullnameByUsername() Naming Exception: " + e); return null; } return fullName; } //GET THE DATATEL ID GIVEN A USERNAME public String getDatatelidByUsername(String username, String userid, String password){ if(username==null){ return ""; } if( userid == null || password == null ) return ""; String datatelid = ""; GroupManagement gm = new GroupManagement(); DirContext ctx; try { ctx = gm.connectToLDAP(userid, password); if ( ctx == null ) return ""; SearchControls ctls = new SearchControls(); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); String[] attrs = { "datatelid" }; ctls.setReturningAttributes(attrs); String filter = "(uid=" + username + ")"; // Search for objects with these matching attributes NamingEnumeration results = ctx.search("",filter,ctls); if ( results != null && results.hasMoreElements()) { SearchResult sr = (SearchResult)results.nextElement(); Attributes readAttr = sr.getAttributes(); Attribute attr=readAttr.get("datatelid"); if ( attr == null ) return ""; else datatelid = (String)attr.get(); }else{ return ""; } ctx.close(); } catch (AuthenticationException e){ System.out.println(util.Tools.getLoggingDate() + " getDatatelidByUsername() Authentication Exception: " + e); return null; } catch (NamingException e) { System.out.println(util.Tools.getLoggingDate() + " getDatatelidByUsername() Naming Exception: " + e); return null; } return datatelid; } /*************************************************************************** **Returns the dn for a given userid by binding anonymously to LDAP directory ***************************************************************************/ public String getDN(String userid) { String dn = ""; String ldap_url = "ldap://ldap.usd.edu:389/o=usd.edu"; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldap_url); DirContext ctx; try { ctx = new InitialDirContext(env); SearchControls ctls = new SearchControls(); ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); //String[] attrs = { "cn" }; //ctls.setReturningAttributes(attrs); String filter = "(uid=" + userid + ")"; // Search for objects with these matching attributes NamingEnumeration results = ctx.search("",filter,ctls); if ( results != null && results.hasMoreElements()) { SearchResult sr = (SearchResult)results.nextElement(); dn = sr.getName(); } else dn = null; ctx.close(); } catch (AuthenticationException e){ System.out.println(util.Tools.getLoggingDate() + " getDN() Authentication Exception: " + e); return null; } catch (NamingException e) { System.out.println(util.Tools.getLoggingDate() + " getDN() Naming Exception: " + e); return null; } return dn; } /**************************************************************** ** Finds the level of authority for a user logging in ** Current levels: Administrative, Instructor, Student ****************************************************************/ public String findAuthorization(){ return findAuthorization(userid, password); } public String findAuthorization(String userid, String password){ Vector memberships = new Vector(); GroupManagement gm = new GroupManagement(); memberships = gm.memberOf(userid, password); String authorization = ""; if (memberships.isEmpty()) { return "none"; } else { Enumeration e = memberships.elements(); while(e.hasMoreElements()) { Object objcurrent = e.nextElement(); String current = (String)objcurrent; int isAdmin = current.indexOf("Admin"); int isInst = current.indexOf("Instructor"); if (isAdmin != -1) { authorization = "admin"; break; } else if (isAdmin == -1 && isInst != -1) { authorization = "instructor"; break; } else authorization= "student"; } return authorization; } } }