/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.ldap.LdapContext; import javax.naming.ldap.InitialLdapContext; import javax.naming.CompositeName; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import javax.naming.CommunicationException; import java.util.HashSet; import java.util.Iterator; /** * Modify an entry with an attribute. * The operation can be a replace, delete or a add new attribute * The function returns the ldap error code */ public class modifyAnAttribute { /** * Main. * * @param args arguments */ public static void main(String[] args) { String hostname=null; String ldapPort=null; String principal=null; String credential=null; String attributeToModify=null; String dnToModify=null; String newAttributeValue=null; String changetype=null; String errorCode=null; String errorMessage=null; String listAttributesToModify=null; int ind1; String attributeName; String attributeValue; Hashtable envLdap = new Hashtable(); LdapContext ctx; Attributes attributes = new BasicAttributes(); HashSet attributeSet = new HashSet(); for (int k=0; k< args.length; k++) { String opt1 = args[k]; String val1 = args[k+1]; if (opt1.equals("-h")) { hostname = val1; } if (opt1.equals("-p")) { ldapPort = val1; } if (opt1.equals("-D")) { principal = val1; } if (opt1.equals("-w")) { credential = val1; } if (opt1.equals("-d")) { dnToModify = val1; } if (opt1.equals("-v")) { newAttributeValue = val1; } if (opt1.equals("-a")) { attributeToModify = val1; } if (opt1.equals("-t")) { changetype = val1; } if (opt1.equals("-l")) { listAttributesToModify = val1; ind1= val1.indexOf(":"); attributeName=val1.substring(0,ind1); if (ind1+1 < val1.length()) { // assume empty strings == no specific value attributeValue=val1.substring(ind1+1); } else { attributeValue = null; } BasicAttribute attrToComplete = null; Iterator it = attributeSet.iterator(); while (attrToComplete == null && it.hasNext()) { BasicAttribute attr = (BasicAttribute) it.next(); if ((attr.getID()).equalsIgnoreCase(attributeName)) { attrToComplete = attr; } } if (attrToComplete == null) { attrToComplete = new BasicAttribute(attributeName); attributeSet.add(attrToComplete); } if (attributeValue != null) { // as opposed to (attributeValue == null), for example in some // attribute delete operations attributeValue=attributeValue.replaceAll("QUOT","\\\""); attrToComplete.add(attributeValue); } } k++; } if ( attributeToModify != null && ( newAttributeValue != null || changetype.equals("delete") ) ) { BasicAttribute attrToComplete = null; attrToComplete = new BasicAttribute(attributeToModify); attributeSet.add(attrToComplete); if (newAttributeValue != null) { // as opposed to (attributeValue == null), for example in some // attribute delete operations newAttributeValue=newAttributeValue.replaceAll("QUOT","\\\""); attrToComplete.add(newAttributeValue); } } Iterator it2 = attributeSet.iterator(); while (it2.hasNext()) { BasicAttribute attr = (BasicAttribute)it2.next(); attributes.put(attr); } String provider = "ldap://" + hostname + ":" + ldapPort + "/"; envLdap.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory"); envLdap.put(Context.SECURITY_AUTHENTICATION, "simple"); envLdap.put(Context.SECURITY_PRINCIPAL, principal); envLdap.put(Context.SECURITY_CREDENTIALS, credential); envLdap.put(Context.PROVIDER_URL, provider); try { CompositeName entryDN = new CompositeName(dnToModify); System.out.println("Modify the entry " + dnToModify); // connect to server ctx = new InitialLdapContext(envLdap, null); // replace attribute if (changetype.equals("replace")) { ctx.modifyAttributes(entryDN, LdapContext.REPLACE_ATTRIBUTE, attributes); } else if (changetype.equals("add")) { // add attribute ctx.modifyAttributes(entryDN, LdapContext.ADD_ATTRIBUTE, attributes); } else if (changetype.equals("delete")) { // add attribute ctx.modifyAttributes(entryDN, LdapContext.REMOVE_ATTRIBUTE, attributes); } ctx.close(); } catch (CommunicationException e1) { errorMessage = e1.getMessage(); } catch (NamingException e2) { errorMessage = e2.getMessage(); } catch (Exception e3) { errorMessage= e3.getMessage(); } // No error, the modify is success if ( errorMessage == null ) { errorCode="0"; } else { System.out.println(errorMessage); int ind=errorMessage.indexOf("-"); if ( ind > 0 ) { errorCode=errorMessage.substring(18, ind-1); } else errorCode="0"; } int RC = Integer.parseInt(errorCode); System.exit(RC); } }