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