package railo.runtime.tag;
import java.io.IOException;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import railo.commons.lang.ClassException;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.PageException;
import railo.runtime.ext.tag.TagImpl;
import railo.runtime.net.ldap.LDAPClient;
import railo.runtime.op.Caster;
import railo.runtime.tag.util.DeprecatedUtil;
import railo.runtime.type.Query;
import railo.runtime.type.util.ArrayUtil;
import railo.runtime.type.util.ListUtil;
// TODO tag ldap
// attr rebind
/**
* Provides an interface to LDAP Lightweight Directory Access Protocol
* directory servers like the Netscape Directory Server.
*/
public final class Ldap extends TagImpl {
private String delimiter=";";
private String server;
private int port=389;
private short secureLevel=LDAPClient.SECURE_NONE;
private String[] returnAsBinary=new String[0];
private String attributes=null;
private String username;
private String password;
private String action="query";
private String[] sort=new String[0];
private String dn;
private int referral;
private int scope=SearchControls.SUBTREE_SCOPE;
private int sortType=LDAPClient.SORT_TYPE_CASE;
private int sortDirection=LDAPClient.SORT_DIRECTION_ASC;
private int startrow=1;
private int timeout=60000;
private int maxrows;
private String name;
private String start;
private String separator=",";
private String filter="objectclass = *";
private int modifyType=DirContext.REPLACE_ATTRIBUTE;
private boolean rebind;
@Override
public void release() {
action="query";
delimiter=";";
port=389;
secureLevel=LDAPClient.SECURE_NONE;
returnAsBinary=new String[0];
username=null;
password=null;
referral=0;
attributes=null;
sort=new String[0];
dn=null;
name=null;
scope=SearchControls.SUBTREE_SCOPE;
startrow=1;
timeout=60000;
maxrows=-1;
sortType=LDAPClient.SORT_TYPE_CASE;
sortDirection=LDAPClient.SORT_DIRECTION_ASC;
start=null;
separator=",";
filter="objectclass = *";
modifyType=DirContext.REPLACE_ATTRIBUTE;
rebind=false;
super.release();
}
/**
* @param filterfile The filterfile to set.
* @throws ApplicationException
*/
public void setFilterfile(String filterfile) {
DeprecatedUtil.tagAttribute(pageContext,"LDAP", "filterfile");
}
/** Specifies the character that cfldap uses to separate multiple
* attribute name/value pairs when more than one attribute is specified
* in the attribute attribute or the attribute that you want to use has
* the default delimiter character, which is the semicolon (;),
* such as mgrpmsgrejecttext;lang-en. The delimiter character is used by the query,
* add, and modify action attributes, and is used by cfldap to output multi-value attributes
* @param delimiter delimiter to set
*/
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
/**
* Used in conjunction with action = "Query". Specifies the first row of the LDAP query to insert
* into the query. The default is 1.
* @param startrow The startrow to set.
*/
public void setStartrow(double startrow) {
this.startrow = (int)startrow;
}
/**
* Specifies the maximum number of entries for LDAP queries.
* @param maxrows The maxrows to set.
*/
public void setMaxrows(double maxrows) {
this.maxrows = (int)maxrows;
}
/**
* Specifies the maximum amount of time, in seconds, to wait for LDAP processing. Defaults to
* 60 seconds.
* @param timeout The timeout to set.
*/
public void setTimeout(double timeout) {
this.timeout = (int)timeout;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Port defaults to the standard LDAP port, 389.
* @param port The port to set.
*/
public void setPort(double port) {
this.port = (int) port;
}
/**
* Identifies the type of security to employ, CFSSL_BASIC or CFSSL_CLIENT_AUTH,
* and additional information that is required by the specified security type.
* @param referral The referral to set.
*/
public void setReferral(double referral) {
this.referral = (int) referral;
}
/**
* Host name "biff.upperlip.com" or IP address "192.1.2.225" of the LDAP server.
* @param server The server to set.
*/
public void setServer(String server) {
this.server = server;
}
/**
* If no user name is specified, the LDAP connection is anonymous.
* @param username The username to set.
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @param secure The secureLevel to set.
* @throws ApplicationException
*/
public void setSecure(String secure) throws ApplicationException {
secure=secure.trim().toUpperCase();
if(secure.equals("CFSSL_BASIC")) secureLevel=LDAPClient.SECURE_CFSSL_BASIC;
else if(secure.equals("CFSSL_CLIENT_AUTH")) secureLevel=LDAPClient.SECURE_CFSSL_CLIENT_AUTH;
else throw new ApplicationException("invalid value for attribute secure ["+secure+"], valid values are [CFSSL_BASIC, CFSSL_CLIENT_AUTH]");
}
/**
* Specifies the scope of the search from the entry specified in the Start attribute
* for action = "Query".
* @param strScope The scope to set.
* @throws ApplicationException
*/
public void setScope(String strScope) throws ApplicationException {
strScope=strScope.trim().toLowerCase();
if(strScope.equals("onelevel")) scope=SearchControls.ONELEVEL_SCOPE;
else if(strScope.equals("base")) scope=SearchControls.OBJECT_SCOPE;
else if(strScope.equals("subtree")) scope=SearchControls.SUBTREE_SCOPE;
else throw new ApplicationException("invalid value for attribute scope ["+strScope+"], valid values are [oneLevel,base,subtree]");
}
/**
* Indicates whether to add, delete, or replace an attribute
* in a multi-value list of attributes.
* @param modifyType The modifyType to set.
* @throws ApplicationException
*/
public void setModifytype(String modifyType) throws ApplicationException {
modifyType=modifyType.trim().toLowerCase();
if(modifyType.equals("add")) this.modifyType=DirContext.ADD_ATTRIBUTE;
else if(modifyType.equals("delete")) this.modifyType=DirContext.REMOVE_ATTRIBUTE;
else if(modifyType.equals("replace")) this.modifyType=DirContext.REPLACE_ATTRIBUTE;
else throw new ApplicationException("invalid value for attribute modifyType ["+modifyType+"], valid values are [add,replace,delete]");
}
/**
* @param returnAsBinary The returnAsBinary to set.
* @throws PageException
*/
public void setReturnasbinary(String returnAsBinary) throws PageException {
this.returnAsBinary = ArrayUtil.trim(ListUtil.toStringArray(ListUtil.listToArrayRemoveEmpty(returnAsBinary,',')));
}
/**
* Indicates the attribute or attributes by which to sort query results.
* Use a comma [,] to separate attributes.
* @param sort The sort to set.
* @throws PageException
*/
public void setSort(String sort) throws PageException {
this.sort = ArrayUtil.trim(ListUtil.toStringArray(ListUtil.listToArrayRemoveEmpty(sort,',')));
}
/**
* Specifies how to sort query results.
* @param sortControl sortControl to set
* @throws PageException
*/
public void setSortcontrol(String sortControl) throws PageException {
String[] sortControlArr = ArrayUtil.trim(ListUtil.toStringArray(ListUtil.listToArrayRemoveEmpty(sortControl,',')));
for(int i=0;i<sortControlArr.length;i++) {
String scs=sortControlArr[i].trim().toLowerCase();
if(scs.equals("asc"))sortDirection=LDAPClient.SORT_DIRECTION_ASC;
else if(scs.equals("desc")) sortDirection=LDAPClient.SORT_DIRECTION_DESC;
else if(scs.equals("case"))sortType=LDAPClient.SORT_TYPE_CASE;
else if(scs.equals("nocase"))sortType=LDAPClient.SORT_TYPE_NOCASE;
else throw new ApplicationException("invalid value for attribute sortControl ["+sortControl+"], " +
"valid values are [asc,desc,case,nocase]");
}
}
/**
* @param strAttributes
*/
public void setAttributes(String strAttributes) {
attributes = strAttributes;
}
/**
* Specifies the LDAP action.
* @param action The action to set.
*/
public void setAction(String action) {
this.action=action.trim().toLowerCase();
}
/**
* Specifies the distinguished name for update actions.
* @param dn The dn to set.
*/
public void setDn(String dn) {
this.dn = dn;
}
/**
* The name you assign to the LDAP query.
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* Specifies the character that cfldap uses to separate attribute values in multi-value attributes.
* This character is used by the query, add, and modify action attributes, and
* by cfldap to output multi-value attributes. The default character is the comma (,).
* @param separator The separator to set.
*/
public void setSeparator(String separator) {
this.separator = separator;
}
/**
* Specifies the distinguished name of the entry to be used to start the search.
* @param start The start to set.
*/
public void setStart(String start) {
this.start = start;
}
/**
* @param filter The filter to set.
*/
public void setFilter(String filter) {
this.filter = filter;
}
/**
* If you set rebind to Yes, cfldap attempts to rebind the referral callback and reissue the query
* by the referred address using the original credentials. The default is No, which means referred
* connections are anonymous.
* @param rebind The rebind to set.
*/
public void setRebind(boolean rebind) {
this.rebind = rebind;
}
@Override
public int doStartTag() throws PageException {
try {
return _doStartTag();
}
catch (Exception e) {
throw Caster.toPageException(e);
}
}
private int _doStartTag() throws NamingException, PageException, IOException, ClassException {
//LDAPClient client=new LDAPClient(server,port,secureLevel,returnAsBinary,username,password,referral);
LDAPClient client=new LDAPClient(server,port,returnAsBinary);
if(secureLevel!=LDAPClient.SECURE_NONE)client.setSecureLevel(secureLevel);
if(username!=null)client.setCredential(username,password);
if(referral>0) client.setReferral(referral);
if(action.equals("add")) {
required("LDAP",action,"attributes",attributes);
required("LDAP",action,"dn",dn);
client.add(dn,attributes,delimiter,separator);
}
else if(action.equals("delete")) {
required("LDAP",action,"dn",dn);
client.delete(dn);
}
else if(action.equals("modifydn")) {
required("LDAP",action,"attributes",attributes);
required("LDAP",action,"dn",dn);
client.modifydn(dn,attributes);
}
else if(action.equals("modify")) {
required("LDAP",action,"attributes",attributes);
required("LDAP",action,"dn",dn);
client.modify(dn,modifyType,attributes,delimiter,separator);
}
else if(action.equals("query")) {
required("LDAP",action,"start",start);
required("LDAP",action,"attributes",attributes);
required("LDAP",action,"name",name);
Query qry = client.query(attributes,scope,startrow,maxrows,
timeout,sort,sortType,sortDirection,start,separator,filter);
pageContext.setVariable(name,qry);
}
else throw new ApplicationException("invalid value for attribute action ["+action+"], valid values are [add,delete,modifydn,modify,query]");
return SKIP_BODY;
}
}