001 package railo.runtime.listener; 002 003 import railo.commons.io.res.Resource; 004 import railo.commons.io.res.util.ResourceUtil; 005 import railo.commons.lang.StringUtil; 006 import railo.commons.lang.types.RefBoolean; 007 import railo.runtime.Mapping; 008 import railo.runtime.MappingImpl; 009 import railo.runtime.PageContext; 010 import railo.runtime.PageContextImpl; 011 import railo.runtime.PageSource; 012 import railo.runtime.config.Config; 013 import railo.runtime.config.ConfigImpl; 014 import railo.runtime.config.ConfigWeb; 015 import railo.runtime.config.ConfigWebImpl; 016 import railo.runtime.exp.ApplicationException; 017 import railo.runtime.exp.PageException; 018 import railo.runtime.net.s3.Properties; 019 import railo.runtime.op.Caster; 020 import railo.runtime.op.Decision; 021 import railo.runtime.orm.ORMConfiguration; 022 import railo.runtime.type.Array; 023 import railo.runtime.type.ArrayImpl; 024 import railo.runtime.type.Collection; 025 import railo.runtime.type.Collection.Key; 026 import railo.runtime.type.KeyImpl; 027 import railo.runtime.type.List; 028 import railo.runtime.type.Scope; 029 import railo.runtime.type.Struct; 030 import railo.runtime.type.StructImpl; 031 import railo.runtime.type.scope.Undefined; 032 import railo.runtime.util.ApplicationContext; 033 034 public final class AppListenerUtil { 035 private static final Collection.Key ACCESS_KEY_ID = KeyImpl.intern("accessKeyId"); 036 private static final Collection.Key AWS_SECRET_KEY = KeyImpl.intern("awsSecretKey"); 037 private static final Collection.Key DEFAULT_LOCATION = KeyImpl.intern("defaultLocation"); 038 private static final Collection.Key HOST = KeyImpl.intern("host"); 039 040 041 public static PageSource getApplicationPageSource(PageContext pc,PageSource requestedPage, String filename, int mode) { 042 if(mode==ApplicationListener.MODE_CURRENT)return getApplicationPageSourceCurrent(requestedPage, filename); 043 if(mode==ApplicationListener.MODE_ROOT)return getApplicationPageSourceRoot(pc, filename); 044 return getApplicationPageSourceCurr2Root(pc, requestedPage, filename); 045 } 046 047 public static PageSource getApplicationPageSourceCurrent(PageSource requestedPage, String filename) { 048 PageSource res=requestedPage.getRealPage(filename); 049 if(res.exists()) return res; 050 return null; 051 } 052 053 public static PageSource getApplicationPageSourceRoot(PageContext pc, String filename) { 054 PageSource ps = ((PageContextImpl)pc).getPageSourceExisting("/".concat(filename)); 055 if(ps!=null) return ps; 056 return null; 057 } 058 059 public static PageSource getApplicationPageSourceCurr2Root(PageContext pc,PageSource requestedPage, String filename) { 060 PageSource ps=requestedPage.getRealPage(filename); 061 if(ps.exists()) { 062 return ps; 063 } 064 Array arr=railo.runtime.type.List.listToArrayRemoveEmpty(requestedPage.getFullRealpath(),"/"); 065 //Config config = pc.getConfig(); 066 for(int i=arr.size()-1;i>0;i--) { 067 StringBuffer sb=new StringBuffer("/"); 068 for(int y=1;y<i;y++) { 069 sb.append((String)arr.get(y,"")); 070 sb.append('/'); 071 } 072 sb.append(filename); 073 ps = ((PageContextImpl)pc).getPageSourceExisting(sb.toString()); 074 if(ps!=null) { 075 return ps; 076 } 077 } 078 return null; 079 } 080 081 082 083 public static PageSource getApplicationPageSource(PageContext pc,PageSource requestedPage, int mode, RefBoolean isCFC) { 084 if(mode==ApplicationListener.MODE_CURRENT)return getApplicationPageSourceCurrent(requestedPage, isCFC); 085 if(mode==ApplicationListener.MODE_ROOT)return getApplicationPageSourceRoot(pc, isCFC); 086 return getApplicationPageSourceCurr2Root(pc, requestedPage, isCFC); 087 } 088 089 public static PageSource getApplicationPageSourceCurrent(PageSource requestedPage, RefBoolean isCFC) { 090 PageSource res=requestedPage.getRealPage("Application.cfc"); 091 if(res.exists()) { 092 isCFC.setValue(true); 093 return res; 094 } 095 res=requestedPage.getRealPage("Application.cfm"); 096 if(res.exists()) return res; 097 return null; 098 } 099 100 public static PageSource getApplicationPageSourceRoot(PageContext pc, RefBoolean isCFC) { 101 PageSource ps = ((PageContextImpl)pc).getPageSourceExisting("/Application.cfc"); 102 if(ps!=null) { 103 isCFC.setValue(true); 104 return ps; 105 } 106 ps = ((PageContextImpl)pc).getPageSourceExisting("/Application.cfm"); 107 if(ps!=null) return ps; 108 return null; 109 } 110 111 112 public static PageSource getApplicationPageSourceCurr2Root(PageContext pc,PageSource requestedPage, RefBoolean isCFC) { 113 PageSource res=requestedPage.getRealPage("Application.cfc"); 114 if(res.exists()) { 115 isCFC.setValue(true); 116 return res; 117 } 118 res=requestedPage.getRealPage("Application.cfm"); 119 if(res.exists()) return res; 120 121 Array arr=railo.runtime.type.List.listToArrayRemoveEmpty(requestedPage.getFullRealpath(),"/"); 122 //Config config = pc.getConfig(); 123 String path; 124 for(int i=arr.size()-1;i>0;i--) { 125 StringBuilder sb=new StringBuilder("/"); 126 for(int y=1;y<i;y++) { 127 sb.append((String)arr.get(y,"")); 128 sb.append('/'); 129 } 130 path=sb.toString(); 131 res = ((PageContextImpl)pc).getPageSourceExisting(path.concat("Application.cfc")); 132 if(res!=null) { 133 isCFC.setValue(true); 134 return res; 135 } 136 137 res = ((PageContextImpl)pc).getPageSourceExisting(path.concat("Application.cfm")); 138 if(res!=null) return res; 139 } 140 return null; 141 } 142 143 public static String toStringMode(int mode) { 144 if(mode==ApplicationListener.MODE_CURRENT) return "curr"; 145 if(mode==ApplicationListener.MODE_ROOT) return "root"; 146 return "curr2root"; 147 } 148 149 public static String toStringType(ApplicationListener listener) { 150 if(listener instanceof NoneAppListener) return "none"; 151 else if(listener instanceof MixedAppListener) return "mixed"; 152 else if(listener instanceof ClassicAppListener) return "classic"; 153 else if(listener instanceof ModernAppListener) return "modern"; 154 return ""; 155 } 156 157 158 public static Mapping[] toMappings(ConfigWeb cw,Object o,Mapping[] defaultValue) { 159 try { 160 return toMappings(cw, o); 161 } catch (Throwable t) { 162 return defaultValue; 163 } 164 } 165 166 public static Mapping[] toMappings(ConfigWeb cw,Object o) throws PageException { 167 Struct sct = Caster.toStruct(o); 168 Key[] keys = sct.keys(); 169 Mapping[] mappings=new Mapping[keys.length]; 170 ConfigWebImpl config=(ConfigWebImpl) cw; 171 String virtual,physical; 172 for(int i=0;i<keys.length;i++) { 173 virtual=translateMappingVirtual(keys[i].getString()); 174 physical=Caster.toString(sct.get(keys[i])); 175 mappings[i]=config.getApplicationMapping(virtual,physical); 176 177 } 178 return mappings; 179 } 180 181 182 private static String translateMappingVirtual(String virtual) { 183 virtual=virtual.replace('\\', '/'); 184 if(!StringUtil.startsWith(virtual,'/'))virtual="/".concat(virtual); 185 return virtual; 186 } 187 188 189 public static Mapping[] toCustomTagMappings(ConfigWeb cw, Object o,Mapping[] defaultValue) { 190 try { 191 return toCustomTagMappings(cw, o); 192 } catch (Throwable t) { 193 return defaultValue; 194 } 195 } 196 197 public static Mapping[] toCustomTagMappings(ConfigWeb cw, Object o) throws PageException { 198 Array array; 199 if(o instanceof String){ 200 array=List.listToArrayRemoveEmpty(Caster.toString(o),','); 201 } 202 else if(o instanceof Struct){ 203 array=new ArrayImpl(); 204 Struct sct=(Struct) o; 205 Key[] keys = sct.keys(); 206 for(int i=0;i<keys.length;i++) { 207 array.append(sct.get(keys[i])); 208 } 209 } 210 else { 211 array=Caster.toArray(o); 212 } 213 MappingImpl[] mappings=new MappingImpl[array.size()]; 214 ConfigWebImpl config=(ConfigWebImpl) cw; 215 for(int i=0;i<mappings.length;i++) { 216 217 mappings[i]=(MappingImpl) config.createCustomTagAppMappings("/"+i,Caster.toString(array.getE(i+1)).trim()); 218 /*mappings[i]=new MappingImpl( 219 config,"/"+i, 220 Caster.toString(array.getE(i+1)).trim(), 221 null,false,true,false,false,false 222 );*/ 223 } 224 return mappings; 225 } 226 227 public static int toLocalMode(Object oMode, int defaultValue) { 228 if(oMode==null) return defaultValue; 229 230 if(Decision.isBoolean(oMode)) { 231 if(Caster.toBooleanValue(oMode, false)) 232 return Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS; 233 return Undefined.MODE_LOCAL_OR_ARGUMENTS_ONLY_WHEN_EXISTS; 234 } 235 String strMode=Caster.toString(oMode,null); 236 if("always".equalsIgnoreCase(strMode)) return Undefined.MODE_LOCAL_OR_ARGUMENTS_ALWAYS; 237 if("update".equalsIgnoreCase(strMode)) return Undefined.MODE_LOCAL_OR_ARGUMENTS_ONLY_WHEN_EXISTS; 238 return defaultValue; 239 } 240 241 public static int toLocalMode(String strMode) throws ApplicationException { 242 int lm = toLocalMode(strMode, -1); 243 if(lm!=-1) return lm; 244 throw new ApplicationException("invalid localMode definition ["+strMode+"] for tag application/application.cfc, valid values are [always,update]"); 245 } 246 247 public static short toSessionType(String str, short defaultValue) { 248 if(!StringUtil.isEmpty(str,true)){ 249 str=str.trim().toLowerCase(); 250 if("cfml".equals(str)) return Config.SESSION_TYPE_CFML; 251 if("j2ee".equals(str)) return Config.SESSION_TYPE_J2EE; 252 if("cfm".equals(str)) return Config.SESSION_TYPE_CFML; 253 if("jee".equals(str)) return Config.SESSION_TYPE_J2EE; 254 if("j".equals(str)) return Config.SESSION_TYPE_J2EE; 255 if("c".equals(str)) return Config.SESSION_TYPE_J2EE; 256 } 257 return defaultValue; 258 } 259 260 public static short toSessionType(String str) throws ApplicationException { 261 if(!StringUtil.isEmpty(str,true)){ 262 str=str.trim().toLowerCase(); 263 if("cfml".equals(str)) return Config.SESSION_TYPE_CFML; 264 if("j2ee".equals(str)) return Config.SESSION_TYPE_J2EE; 265 if("cfm".equals(str)) return Config.SESSION_TYPE_CFML; 266 if("jee".equals(str)) return Config.SESSION_TYPE_J2EE; 267 if("j".equals(str)) return Config.SESSION_TYPE_J2EE; 268 if("c".equals(str)) return Config.SESSION_TYPE_J2EE; 269 } 270 throw new ApplicationException("invalid sessionType definition ["+str+"] for tag application/application.cfc, valid values are [cfml,j2ee]"); 271 } 272 273 public static Properties toS3(Struct sct) { 274 String host=Caster.toString(sct.get(HOST,null),null); 275 if(StringUtil.isEmpty(host))host=Caster.toString(sct.get(KeyImpl.SERVER,null),null); 276 277 return toS3( 278 Caster.toString(sct.get(ACCESS_KEY_ID,null),null), 279 Caster.toString(sct.get(AWS_SECRET_KEY,null),null), 280 Caster.toString(sct.get(DEFAULT_LOCATION,null),null), 281 host 282 ); 283 } 284 285 public static Properties toS3(String accessKeyId, String awsSecretKey, String defaultLocation, String host) { 286 Properties s3 = new Properties(); 287 if(!StringUtil.isEmpty(accessKeyId))s3.setAccessKeyId(accessKeyId); 288 if(!StringUtil.isEmpty(awsSecretKey))s3.setSecretAccessKey(awsSecretKey); 289 if(!StringUtil.isEmpty(defaultLocation))s3.setDefaultLocation(defaultLocation); 290 if(!StringUtil.isEmpty(host))s3.setHost(host); 291 return s3; 292 } 293 294 public static void setORMConfiguration(PageContext pc, ApplicationContextPro ac,Struct sct) throws PageException { 295 if(sct==null)sct=new StructImpl(); 296 Resource res=ResourceUtil.getResource(pc, pc.getCurrentTemplatePageSource()).getParentResource(); 297 ConfigImpl config=(ConfigImpl) pc.getConfig(); 298 ac.setORMConfiguration(ORMConfiguration.load(config,ac,sct,res,config.getORMConfig())); 299 300 // datasource 301 Object o = sct.get(KeyImpl.DATA_SOURCE,null); 302 if(o!=null) ac.setORMDatasource(Caster.toString(o)); 303 } 304 305 306 /** 307 * translate int definition of script protect to string definition 308 * @param scriptProtect 309 * @return 310 */ 311 public static String translateScriptProtect(int scriptProtect) { 312 if(scriptProtect==ApplicationContext.SCRIPT_PROTECT_NONE) return "none"; 313 if(scriptProtect==ApplicationContext.SCRIPT_PROTECT_ALL) return "all"; 314 315 Array arr=new ArrayImpl(); 316 if((scriptProtect&ApplicationContext.SCRIPT_PROTECT_CGI)>0) arr.appendEL("cgi"); 317 if((scriptProtect&ApplicationContext.SCRIPT_PROTECT_COOKIE)>0) arr.appendEL("cookie"); 318 if((scriptProtect&ApplicationContext.SCRIPT_PROTECT_FORM)>0) arr.appendEL("form"); 319 if((scriptProtect&ApplicationContext.SCRIPT_PROTECT_URL)>0) arr.appendEL("url"); 320 321 322 323 try { 324 return List.arrayToList(arr, ","); 325 } catch (PageException e) { 326 return "none"; 327 } 328 } 329 330 331 /** 332 * translate string definition of script protect to int definition 333 * @param scriptProtect 334 * @return 335 */ 336 public static int translateScriptProtect(String strScriptProtect) { 337 strScriptProtect=strScriptProtect.toLowerCase().trim(); 338 339 if("none".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_NONE; 340 if("no".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_NONE; 341 if("false".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_NONE; 342 343 if("all".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_ALL; 344 if("true".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_ALL; 345 if("yes".equals(strScriptProtect)) return ApplicationContext.SCRIPT_PROTECT_ALL; 346 347 String[] arr = List.listToStringArray(strScriptProtect, ','); 348 String item; 349 int scriptProtect=0; 350 for(int i=0;i<arr.length;i++) { 351 item=arr[i].trim(); 352 if("cgi".equals(item) && (scriptProtect&ApplicationContext.SCRIPT_PROTECT_CGI)==0) 353 scriptProtect+=ApplicationContext.SCRIPT_PROTECT_CGI; 354 else if("cookie".equals(item) && (scriptProtect&ApplicationContext.SCRIPT_PROTECT_COOKIE)==0) 355 scriptProtect+=ApplicationContext.SCRIPT_PROTECT_COOKIE; 356 else if("form".equals(item) && (scriptProtect&ApplicationContext.SCRIPT_PROTECT_FORM)==0) 357 scriptProtect+=ApplicationContext.SCRIPT_PROTECT_FORM; 358 else if("url".equals(item) && (scriptProtect&ApplicationContext.SCRIPT_PROTECT_URL)==0) 359 scriptProtect+=ApplicationContext.SCRIPT_PROTECT_URL; 360 361 } 362 363 return scriptProtect; 364 } 365 366 367 public static String translateLoginStorage(int loginStorage) { 368 if(loginStorage==Scope.SCOPE_SESSION) return "session"; 369 return "cookie"; 370 } 371 372 373 public static int translateLoginStorage(String strLoginStorage, int defaultValue) { 374 strLoginStorage=strLoginStorage.toLowerCase().trim(); 375 if(strLoginStorage.equals("session"))return Scope.SCOPE_SESSION; 376 if(strLoginStorage.equals("cookie"))return Scope.SCOPE_COOKIE; 377 return defaultValue; 378 } 379 380 381 public static int translateLoginStorage(String strLoginStorage) throws ApplicationException { 382 int ls=translateLoginStorage(strLoginStorage, -1); 383 if(ls!=-1) return ls; 384 throw new ApplicationException("invalid loginStorage definition ["+strLoginStorage+"], valid values are [session,cookie]"); 385 } 386 } 387 388