/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: IdRepoSampleUtils.java,v 1.5 2008/08/07 22:08:20 goodearth Exp $ * */ package com.sun.identity.samples.clientsdk.idrepo; import java.io.*; import java.util.*; import java.lang.Integer; import java.security.Principal; import javax.security.auth.callback.*; import com.iplanet.sso.SSOTokenManager; import com.iplanet.sso.SSOToken; import com.iplanet.sso.SSOException; import com.sun.identity.authentication.AuthContext; import com.sun.identity.authentication.spi.AuthLoginException; import com.sun.identity.authentication.share.AuthXMLTags; import com.sun.identity.authentication.util.ISAuthConstants; import com.sun.identity.idm.AMIdentity; import com.sun.identity.idm.AMIdentityRepository; import com.sun.identity.idm.IdRepoException; import com.sun.identity.idm.IdType; /** * This class * * * @author */ public class IdRepoSampleUtils { AuthContext lc = null; String userID = null; public IdRepoSampleUtils() { } public SSOToken realmLogin (String userid, String password, String realm) throws SSOException, AuthLoginException, Exception { SSOTokenManager mgr; String adminDN; String adminPassword; SSOToken ssoToken = null; AuthContext.IndexType authType = AuthContext.IndexType.MODULE_INSTANCE; try { lc = new AuthContext(realm); } catch (AuthLoginException le) { System.err.println( "IdRepoSampleUtils: could not get AuthContext for realm " + realm); throw le; } try { lc.login(); } catch (AuthLoginException le) { System.err.println("IdRepoSampleUtils: Failed to start login " + "for default authmodule"); throw le; } userID = userid; Callback[] callbacks = null; Hashtable values = new Hashtable(); values.put(AuthXMLTags.NAME_CALLBACK, userid); values.put(AuthXMLTags.PASSWORD_CALLBACK, password); while (lc.hasMoreRequirements()) { callbacks = lc.getRequirements(); try { fillCallbacks(callbacks, values); lc.submitRequirements(callbacks); } catch (Exception e) { System.err.println( "Failed to submit callbacks!"); e.printStackTrace(); return null; } } AuthContext.Status istat = lc.getStatus(); if (istat == AuthContext.Status.SUCCESS) { System.out.println("==>Authentication SUCCESSFUL for user " + userid); } else if (istat == AuthContext.Status.COMPLETED) { System.out.println("==>Authentication Status for user " + userid+ " = " + istat); return null; } try { ssoToken = lc.getSSOToken(); } catch (Exception e) { System.err.println( "Failed to get SSO token! " + e.getMessage()); throw e; } return ssoToken; } public void logout () throws AuthLoginException { try { lc.logout(); } catch (AuthLoginException alexc) { System.err.println ("IdRepoSampleUtils: logout failed for user '" + userID + "'"); throw alexc; } } protected void fillCallbacks(Callback[] callbacks, Hashtable values) throws Exception { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof NameCallback) { NameCallback nc = (NameCallback) callbacks[i]; nc.setName((String)values.get(AuthXMLTags.NAME_CALLBACK)); } else if (callbacks[i] instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback) callbacks[i]; pc.setPassword(((String)values.get( AuthXMLTags.PASSWORD_CALLBACK)).toCharArray()); } else if (callbacks[i] instanceof TextInputCallback) { TextInputCallback tic = (TextInputCallback) callbacks[i]; tic.setText((String)values.get( AuthXMLTags.TEXT_INPUT_CALLBACK)); } else if (callbacks[i] instanceof ChoiceCallback) { ChoiceCallback cc = (ChoiceCallback) callbacks[i]; cc.setSelectedIndex(Integer.parseInt((String)values.get( AuthXMLTags.CHOICE_CALLBACK))); } } } public String getLine() { StringBuffer buf = new StringBuffer(80); int c; try { while ((c = System.in.read()) != -1) { char ch = (char)c; if (ch == '\r') { continue; } if (ch == '\n') { break; } buf.append(ch); } } catch (IOException e) { System.err.println ("getLine: " + e.getMessage()); } return (buf.toString()); } public String getLine (String prompt) { System.out.print (prompt); return (getLine()); } public String getLine (String prompt, String defaultVal) { System.out.print (prompt + " [" + defaultVal + "]: "); String tmp = getLine(); if (tmp.length() == 0) { tmp = defaultVal; } return (tmp); } /* * return integer value of String sVal; -1 if error */ public int getIntValue (String sVal) { int i = -1; try { i = Integer.parseInt (sVal); } catch (NumberFormatException e) { System.err.println ("'" + sVal + "' does not appear to be an integer."); } return i; } /* * can only create or delete AMIdentities of IdType user, agentgroup, * agentonly */ public IdType getIdTypeToCreateOrDelete() { IdType tType = null; System.out.println (" Supported IdTypes:\n" + "\t0: user\n\t1: agent\n\t2: agentonly\n\t3: agentgroup\n\t4: realm\n\t5: No selection"); String answer = getLine ("Select type: [0..3]: "); int i = getIntValue(answer); switch (i) { case 0: // user tType = IdType.USER; break; case 1: // agent tType = IdType.AGENT; break; case 2: // agentonly tType = IdType.AGENTONLY; break; case 3: // agentgroup tType = IdType.AGENTGROUP; break; case 4: // realm tType = IdType.REALM; break; case 5: // no selection break; default: // invalid selection System.err.println(answer + " is an invalid selection."); } return tType; } /* * get the IdType selected from the list of supported IdTypes for * this AMIdentityRepository object. can be "null" if no selection * made. */ public IdType getIdType(AMIdentityRepository idRepo) { IdType tType = null; String realmName = null; try { realmName = idRepo.getRealmIdentity().getRealm(); Set types = idRepo.getSupportedIdTypes(); Object[] idtypes = types.toArray(); System.out.println(" Supported IdTypes:"); int i = 0; for (i = 0; i < idtypes.length; i++) { tType = (IdType)idtypes[i]; System.out.println("\t" + i + ": " + tType.getName()); } System.out.println ("\t" + i + ": No selection"); String answer = getLine ("Select type: [0.." + idtypes.length + "]: "); i = getIntValue(answer); tType = (IdType)idtypes[0]; if (i == idtypes.length) { return (null); } else if ((i >= 0) && (i < idtypes.length)) { tType = (IdType)idtypes[i]; } else { System.err.println(answer + " is an invalid selection."); return (null); } } catch (IdRepoException ire) { System.err.println("getIdType: IdRepoException" + " getting Supported IdTypes for '" + realmName + "': " + ire.getMessage()); } catch (SSOException ssoe) { System.err.println("getIdType: SSOException" + " getting Supported IdTypes for '" + realmName + "': " + ssoe.getMessage()); } return (tType); } /* * print out elements in the Set "results". header and trailer * titling Strings. more generic (i.e., usually expecting Strings) * than other printResults(String, Set). */ public void printResults ( String header, Set results, String trailer) { if (results.isEmpty()) { System.out.println(header + " has no " + trailer); } else { System.out.println (header + " has " + results.size() + " " + trailer + ":"); for (Iterator it = results.iterator(); it.hasNext(); ) { System.out.println (" " + it.next()); } } System.out.println(""); return; } /* * print out elements in the Set "results". header and trailer * titling Strings. more generic (i.e., usually expecting Strings) * than other printResults(String, Set). */ public void printResultsRealm ( String header, Set results, String trailer) { if (results.isEmpty()) { System.out.println(header + " has no " + trailer); } else { System.out.println (header + " has " + results.size() + " " + trailer + ":"); for (Iterator it = results.iterator(); it.hasNext(); ) { AMIdentity amid = (AMIdentity)it.next(); System.out.println (" " + amid.getRealm()); } } System.out.println(""); return; } /* * for the Set of IdTypes specified in "results", get and print * 1. the IdTypes it can be a member of * 2. the IdTypes it can have as members * 3. the IdTypes it can add to itself */ public void printIdTypeResults( String header, Set results, String trailer) { if (results.isEmpty()) { System.out.println(header + " has no " + trailer); } else { System.out.println(header + " has " + results.size() + " " + trailer + ":"); IdType itype = null; Set idSet = null; for (Iterator it = results.iterator(); it.hasNext(); ) { itype = (IdType)it.next(); System.out.println (" IdType " + itype.getName()); idSet = itype.canBeMemberOf(); printIdTypeSet("BE a member of IdType(s):", idSet); idSet = itype.canHaveMembers(); printIdTypeSet("HAVE a member of IdType(s):", idSet); idSet = itype.canAddMembers(); printIdTypeSet("ADD members of IdType(s):", idSet); } } System.out.println(""); return; } /* * used by printIdTypeResults(), above, to print out * AMIdentity names of elements in the Set. */ private void printIdTypeSet ( String header, Set idSet) { System.out.print ("\tcan " + header); if (idSet.size() > 0) { for (Iterator it = idSet.iterator(); it.hasNext(); ) { System.out.print (" " + ((IdType)it.next()).getName()); } System.out.print("\n"); } else { System.out.println (" [NONE]"); } } /* * print the objects (String or AMIdentity.getName()) in the * specified Array, and return the index of the one selected. * -1 if none selected. */ public int selectFromArray ( Object[] objs, String hdr, String prompt) { AMIdentity amid = null; String ans = null; boolean isIdType = false; boolean isString = false; if (objs.length <= 0) { return (-1); } System.out.println(hdr); int i = -1; String objclass = objs[0].getClass().getName(); if (objclass.indexOf("AMIdentity") >= 0) { isIdType = true; } else if (objclass.indexOf("String") >= 0) { isString = true; } for (i = 0; i < objs.length; i++) { if (isIdType) { amid = (AMIdentity)objs[i]; System.out.println("\t" + i + ": " + amid.getName()); } else if (isString) { System.out.println("\t" + i + ": " + (String)objs[i]); } else { System.out.println("\t" + i + ": Class = " + objclass); } } System.out.println("\t" + i + ": No Selection"); ans = getLine (prompt + ": [0.." + objs.length + "]: "); i = getIntValue(ans); return i; } /* * print the objects (String or AMIdentity.getName()) in the * specified Set, and return the object of the one selected. * null if none selected. */ public Object selectFromSet (Set itemSet) { Object[] objs = itemSet.toArray(); AMIdentity amid = null; AMIdentity amid2 = null; int setsize = itemSet.size(); int i; boolean isAMId = false; boolean isString = false; String str = null; if (setsize <= 0) { return null; } String objclass = objs[0].getClass().getName(); if (objclass.indexOf("AMIdentity") >= 0) { isAMId = true; } else if (objclass.indexOf("String") >= 0) { isString = true; } if (setsize > 0) { System.out.println("Available selections:"); for (i = 0; i < setsize; i++) { if (isAMId) { amid = (AMIdentity)objs[i]; System.out.println("\t" + i + ": " + amid.getName()); } else if (isString) { System.out.println("\t" + i + ": " + (String)objs[i]); } else { System.out.println("\t" + i + ": Class = " + objclass); } } System.out.println ("\t" + i + ": No selection"); String answer = getLine("Select identity: [0.." + setsize + "]: "); int ians = getIntValue(answer); if ((ians >= 0) && (ians < setsize)) { return (objs[ians]); } else if (ians == setsize) { } else { System.err.println ("'" + answer + "' is invalid."); } } return null; } public void waitForReturn() { waitForReturn("Hit when ready: "); String answer = getLine(); } public void waitForReturn(String prompt) { System.out.print (prompt); String answer = getLine(); } }