package railo.runtime.tag; import java.io.IOException; import railo.runtime.coder.Base64Coder; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.BodyTagImpl; import railo.runtime.listener.ApplicationContext; import railo.runtime.op.Caster; import railo.runtime.security.Credential; import railo.runtime.type.Array; import railo.runtime.type.Collection.Key; import railo.runtime.type.KeyImpl; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; import railo.runtime.type.util.KeyConstants; import railo.runtime.type.util.ListUtil; /** * */ public final class Login extends BodyTagImpl { private static final Key CFLOGIN = KeyImpl.intern("cflogin"); private int idletimeout=1800; private String applicationtoken; private String cookiedomain; @Override public void release() { super.release(); idletimeout=1800; applicationtoken=null; cookiedomain=null; } /** * @param applicationtoken The applicationtoken to set. */ public void setApplicationtoken(String applicationtoken) { this.applicationtoken = applicationtoken; } /** * @param cookiedomain The cookiedomain to set. */ public void setCookiedomain(String cookiedomain) { this.cookiedomain = cookiedomain; } /** * @param idletimeout The idletimout to set. */ public void setIdletimeout(double idletimeout) { this.idletimeout = (int) idletimeout; } @Override public int doStartTag() throws PageException { ApplicationContext ac=pageContext.getApplicationContext(); ac.setSecuritySettings(applicationtoken,cookiedomain,idletimeout); Credential remoteUser = pageContext.getRemoteUser(); if(remoteUser==null) { // Form Object name=pageContext.formScope().get("j_username",null); Object password=pageContext.formScope().get("j_password",null); if(name!=null) { setCFLogin(name,password); return EVAL_BODY_INCLUDE; } // Header String strAuth = pageContext. getHttpServletRequest().getHeader("authorization"); if(strAuth!=null) { int pos=strAuth.indexOf(' '); if(pos!=-1) { String format=strAuth.substring(0,pos).toLowerCase(); if(format.equals("basic")) { String encoded=strAuth.substring(pos+1); String dec; try { dec=Base64Coder.decodeToString(encoded,"UTF-8"); } catch (IOException e) { throw Caster.toPageException(e); } //print.ln("encoded:"+encoded); //print.ln("decoded:"+Base64Util.decodeBase64(encoded)); Array arr=ListUtil.listToArray(dec,":"); if(arr.size()<3) { if(arr.size()==1) setCFLogin(arr.get(1,null),""); else setCFLogin(arr.get(1,null),arr.get(2,null)); } } } } return EVAL_BODY_INCLUDE; } return SKIP_BODY; } /** * @param username * @param password */ private void setCFLogin(Object username, Object password) { if(username==null) return; if(password==null) password=""; Struct sct=new StructImpl(); sct.setEL(KeyConstants._name,username); sct.setEL(KeyConstants._password,password); pageContext.undefinedScope().setEL(CFLOGIN,sct); } @Override public int doEndTag() { pageContext.undefinedScope().removeEL(CFLOGIN); return EVAL_PAGE; } public static String getApplicationName(ApplicationContext appContext) { return "cfauthorization_"+appContext.getSecurityApplicationToken(); } public static String getCookieDomain(ApplicationContext appContext) { return appContext.getSecurityCookieDomain(); } public static int getIdleTimeout(ApplicationContext appContext) { return appContext.getSecurityIdleTimeout(); } }