import java.util.Hashtable;
import java.util.Date;
import java.util.Calendar;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.Attributes;
import javax.naming.directory.Attribute;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.ModificationItem;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
class ModifyTimeStamp {
public static void main(String[] args) {
String expTime;
if (args.length != 5) {
usage();
}
String hostURL = args[0];
String loginDN = args[1];
String password = args[2];
String userDN = args[3];
int days = Integer.parseInt( args[4]);
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, hostURL);
env.put( Context.SECURITY_PRINCIPAL, loginDN );
env.put( Context.SECURITY_CREDENTIALS, password );
DirContext ctx = new InitialDirContext(env);
System.out.println( "\n Entry DN: " + userDN );
System.out.println( " Day Extension: " + days + "\n" );
if ( (expTime = GetTime( ctx, userDN )) == null )
System.out.println("\n passwordExpirationTime was not"
+ " initialized.");
else {
System.out.println( " Old passwordExpirationTime: "
+ expTime + " (UTC)");
printTime(expTime);
String newExpTime = extendTime( expTime, days );
ModificationItem[] mod = new ModificationItem[1];
Attribute modPwdExpTime = new BasicAttribute(
"passwordExpirationTime", newExpTime);
mod[0] = new ModificationItem( DirContext.REPLACE_ATTRIBUTE,
modPwdExpTime);
System.out.println();
System.out.println( " Modifying passwordExpirationTime..." );
ctx.modifyAttributes(userDN, mod);
System.out.println( " Modification was successful." );
if ( (newExpTime = GetTime( ctx, userDN )) == null )
System.out.println("\n Failed to get"
+ " passwordExpirationTime value.");
else {
System.out.println( "\n New"
+ " passwordExpirationTime: " + newExpTime + " (UTC)");
printTime(newExpTime);
}
}
ctx.close();
}
catch (NamingException e) {
System.err.println("ModifyTimeStamp example failed.");
e.printStackTrace();
}
finally {
System.exit(0);
}
}
public static String GetTime(DirContext ctx, String entryDN) {
String attrValue = null;
String returnAttr[] = { "passwordExpirationTime" };
try {
Attributes attrs = ctx.getAttributes( entryDN, returnAttr );
NamingEnumeration enu = attrs.getAll();
while ( enu.hasMore() ) {
Attribute attr = (Attribute)enu.next();
NamingEnumeration attrValues = attr.getAll();
attrValue = (String)attrValues.next();
}
}
catch( NamingException e ) {
System.out.println( "\n Failed to read: " + entryDN );
System.out.println( "\n Error: " + e.toString() );
System.exit(1);
}
return attrValue;
}
public static void printTime( String utc ) {
DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
try {
Date date = formatter.parse( utc );
System.out.print( " ");
System.out.println( date + " (UTC)");
}
catch(ParseException pe) {
System.out.println( "\nError: " + pe.toString() );
}
}
public static String extendTime( String utc, int days ) {
int year = Integer.parseInt( utc.substring( 0, 4 ));
int mon = Integer.parseInt( utc.substring( 4, 6 ));
int day = Integer.parseInt( utc.substring( 6, 8 ));
int hour = Integer.parseInt( utc.substring( 8, 10 ));
int minute = Integer.parseInt( utc.substring( 10, 12 ));
int second = Integer.parseInt( utc.substring( 12, 14 ));
Calendar utcTime = Calendar.getInstance();
utcTime.set( year, mon-1 , day, hour, minute, second );
utcTime.add(Calendar.DAY_OF_MONTH, days );
Date date = utcTime.getTime();
DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
return formatter.format( date );
}
public static void usage() {
System.err.println("\n Usage: java ModifyTimeStamp <host URL> "
+ "<login dn> <password>\n <user dn> <day extension>\n");
System.err.println(" Example: java ModifyTimeStamp ldap://Acme.com:"
+ "389 \"cn=Admin,o=Acme\"\n secret \"cn=JSmith,ou=sales,"
+ "o=Acme\" 90");
System.exit(1);
}
}